KnigaRead.com/
KnigaRead.com » Документальные книги » Прочая документальная литература » Джош Кауфман - Первые 20 часов. Как быстро научиться… чему угодно

Джош Кауфман - Первые 20 часов. Как быстро научиться… чему угодно

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Джош Кауфман, "Первые 20 часов. Как быстро научиться… чему угодно" бесплатно, без регистрации.
Перейти на страницу:

Предположим, что мы пишем программу для сайта Amazon.com и хотим вывести на экран список книг Дж. К. Роулинг, автора серии о Гарри Поттере. Команда на языке SQL будет выглядеть так:

SELECT * FROM Book WHERE author = "J.K. Rowling" ORDER BY

title;

Данная команда извлекает из базы данных все записи, в поле «author» которых содержится «J.K. Rowling», и располагает их в алфавитном порядке по названию книги.

К сожалению, заставить SQL или любой другой язык запросов базы данных корректно работать с такими языками, как Ruby, — сложная задача. Непросто писать программу на одном языке, не говоря уже о нескольких языках одновременно.

Здесь на помощь приходит ORM: она позволяют программисту писать программу на одном языке, который ORM затем переводит на язык базы данных. Так гораздо проще.

Таким образом, DataMapper представляет собой библиотеку, облегчающую связь с базами данных, использующих Ruby. По умолчанию DataMapper содержит большое количество удобных функций для создания, чтения, обновления и удаления записей в базе данных. Поскольку программа DataMapper существует уже довольно давно и тщательно протестирована, в большинстве случаев надежнее пользоваться ею, а не пытаться писать собственную программу для базы данных.

DataMapper доступна в виде стандартной библиотеки, которая устанавливается следующим образом:

$ gem install data_mapper

Поскольку объем библиотеки DataMapper очень велик, ее можно устанавливать по частям. Этот принцип называется «модульностью», и он может служить признаком профессионального программирования. Вот как выглядит команда загрузки всех отдельных библиотек:

$ gem install dm-core dm-aggregates dm-constraints dm-migrations dm-transactions dm-serializer dm-timestamps dm-validations dm-types

Вместо установки всей библиотеки вы можете загрузить только те модули, которые будет использовать ваша программа, что гораздо эффективнее.

Использование DataMapper

Теперь, когда библиотека DataMapper установлена, я должен научиться с ее помощью 1) связываться с базой данных и 2) создавать базу данных для хранения и извлечения нужной мне информации.

В документации на Heroku указано, что следующая команда позволит приложению Sinatra связываться с базой данных:

DataMapper.setup (: default, ENV ['DATABASE_URL'] ||

"sqlite3://# {Dir.pwd} /database.db")

В данном случае || означает «или». ENV ['DATABASE_URL'] — это переменная, которую Heroku использует для вашей базы данных. Если эта база данных недоступна, то будет применен второй вариант, база данных под названием Sqlite [39].

Sqlite установлена на компьютерах Mac по умолчанию и уже готова к работе. DataMapper может связываться и с Postgres, и со Sqlite, если я установлю обе библиотеки:

$ gem install dm-sqlite-adapter dm-postgres-adapter

Это означает, что мое приложение будет использовать Postgres при запуске на сервере Heroku и Sqlite при запуске на моем компьютере. В обоих случаях моя программа остается одной и той же, несмотря на то что базы данных используют разные языки. Это действительно здорово.

Кстати, по поводу запуска такого приложения на моем компьютере… Как это сделать?

Pow!

Информацию о том, как запустить приложения такого типа на моем компьютере, я искал на Stack Overflow и Hacker News. К счастью, существует несколько вариантов. Похоже, я могу установить библиотеки (например, Foreman или Shotgun), которые выполняют приложение, когда я ввожу команду в Terminal, или программу, поддерживающую приложение все время.

Программа, использующая этот подход, называется Pow [40] — «Rack-сервер нулевой конфигурации для Mac OS X». Сайт обещает установить локальный хостинг для разработки приложений на моем компьютере меньше чем за минуту. Звучит привлекательно!

Установка Pow занимает меньше десяти секунд: для загрузки и установки приложения требуется всего одна команда в Terminal. После этого вы вводите команду, которая связывает вашу программу с Pow, и Pow позволит запускать ее на вашем компьютере.

Библиотека Ruby с названием Powder [41] еще больше облегчает этот процесс:

$ gem install powder

После установки библиотеки вы устанавливаете Pow:

$ powder install

Затем переходите в корневой каталог своего приложения и вводите следующую команду:

$ powder link

Вот и все. Мой корневой каталог называется «codex», поэтому теперь приложение выполняется на моем компьютере на http://codex.dev, и у меня появляется возможность протестировать свою работу.

Если я вношу изменения, следующая команда заново запускает программу:

$ powder restart

Все просто. Теперь я готов писать программу. Каждый вечер я буду выделять полтора часа на составление программы — пока работа не будет закончена.

Кодируем, тестируем, исправляем

Теперь я буду описывать, что я делаю, а не как. Полный текст программы вы, если захотите, сможете найти на https://github.com/first20hours/codex.

Вот как должно выглядеть приложение, когда работа будет завершена.



Вы, наверное, заметили, что дизайн страницы состоит из трех частей: верхней навигационной панели, области основного содержания и бокового поля. Я сконструировал эту структуру с помощью инструмента Bootstrap [42], созданного разработчиками Twitter Марком Отто и Джейкобом Торнтоном.

Веб-страницу не нужно разрабатывать с нуля, поскольку Bootstrap представляет собой библиотеку шаблонов HTML и CSS, находящихся в открытом доступе. Использование Bootstrap сэкономит вам уйму времени: вы сможете собрать прототип своего приложения за несколько минут вместо нескольких дней.

Основная единица этого приложения называется «Page», и она отображает запись, хранящуюся в базе данных. Специальная кнопка позволяет просматривать все записи базы данных. Внизу расположены еще две кнопки. Первая дает возможность редактировать текущую страницу, вторая — удалить.

В боковом поле реализованы три основные функции. Вверху расположена форма, позволяющая создать новую страницу, для чего нужно ввести ее название. Здесь также есть список страниц, добавленных пользователем, и этот список может служить указателем. И, наконец, справка по форматированию, помогающая пользователю вспомнить, как применять стандартные функции форматирования.

Верхняя навигационная панель очень проста. Она содержит ссылку на главную страницу, а также дополнительную ссылку на экран «Показать все страницы». Позже я могу добавить еще функции, если потребуется, но пока этого достаточно.

Каждое интернет-приложение имеет главную страницу, и я должен решить, что хочу видеть на своей главной странице. В данном случае мне просто нужно отобразить запись Home базы данных.

Что же содержится в Page? Поскольку каждая Page представляет собой запись базы данных с полями, в которых хранится информация, я должен указать DataMapper, какие поля требуется создать. Вот как это выглядит:

class Page

include DataMapper:: Resource

property: id, Serial

property: title, String

property: content, Text

property: lastupdated, DateTime

end

DataMapper.finalize

Данный фрагмент программы использует DataMapper для создания нового объекта под названием Page. Теперь Ruby может использовать Page подобно любому другому объекту, а я могу создавать и применять методы, которые формируют, изменяют и удаляют объекты Page. Изменения, внесенные в Page, сохраняются в базе данных при помощи DataMapper.

Команда DataMapper.finalize указывает приложению, чтобы оно создало эти поля, если они еще не существуют в действующей базе данных.

Теперь, когда база данных есть, пора выяснить, какие маршруты должна будет обслуживать среда разработки Sinatra. Вот какой у меня получился список:

# Show home page

g e t '/'

# Creates new note from "new page" form

p o s t '/'

# Displays requested note

get '/: url/'

# Edits requested note

get '/: url/edit'

# Saves user edits to note

p o s t '/: u r l /e d it'

# Deletes specified note

delete '/: url/'

# List all pages in database

get '/all/'

# Error handling

not_found

error

Это очень полезный список. Мое приложение будет строиться вокруг команд, которые я создам для каждого маршрута.

Слаги, везде слаги!

Помните, я сравнивал базу данных с магической стопкой учетных карточек, которую вы можете просматривать так, как вам удобно? Нам нужен способ поиска конкретных записей, и именно потому в этих маршрутах встречается url. Содержание параметра url указывает базе данных, какую запись следует извлекать.

В качестве параметра можно использовать заголовок страницы, но тут есть одна проблема: браузеры не любят в интернет-адресах такие вещи, как пробелы, заглавные буквы и специальные символы (например, $ и %). В заголовках такие символы встречаются достаточно часто, поэтому от них нужно избавиться.

Строка, однозначно определяющая страницу сайта, называется слагом [43]. Слаг моей страницы будет основан на заголовке и подчиняться правилам, приемлемым для интернет-адресов.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*