Шрифт:
Интервал:
Закладка:
На этот раз система сработала, но в будущем я должен добавить файл Gemfile.lock в репозиторий git, прежде чем размещать приложение. Полезная информация!
Теперь, когда мое простейшее приложение создано и запущено, я могу наконец начать разбираться, как работает Sinatra. Документация среды программирования Sinatra [32] очень подробна и включает множество примеров, и поэтому я решил начать именно с нее.
Основа приложений Sinatra называется маршрут. Лучше всего объяснить это понятие на примере.
Наше простое приложение Sinatra имеет один маршрут, который содержит «корень» сайта. Пользователи интернета обычно указывают корень сайта как начальную страницу сайта.
Если вы заходите на google.com или на yahoo.com, то браузер посылает запрос на сервер Google или Yahoo. Этот запрос называется GET-запросом, и он просит сервер показать вам, что находится в корневом каталоге сайта. Протокол, или формат, который использует компьютер для отправки запроса, называется HTTP, что расшифровывается как «протокол передачи гипертекста». Именно с этой аббревиатуры начинаются адреса в интернете — «http://».
GET — это самый распространенный из запросов HTTP, но не единственный. Существуют три дополнительных «глагола» HTTP:
● POST — отправить ресурс на сервер;
● PUT — обновить ресурс на сервере;
● DELETE — удалить ресурс с сервера.
Если вы оставляете на сайте комментарии, то ваше остроумное замечание отправляется на сервер командой POST. Если вы сделали ошибку и редактируете комментарий, то обновление выполняется с помощью команды PUT. А если вы решили, что комментарий неудачный и его нужно удалить, браузер посылает команду DELETE.
Маршруты GET, POST, PUT и DELETE — это основа работы приложений Sinatra. Каждый создаваемый вами маршрут является условным: «Делать Х, если команда GET/POST/PUT/DELETE получена на маршруте Y».
Маршруты Sinatra также содержат переменные, которые называются параметрами. Приложения Sinatra обычно используют параметры в качестве входных данных для процесса, содержащегося в каждом маршруте.
Давайте модифицируем наше простое приложение Sinatra «Hello, World!», чтобы оно приветствовало пользователя по имени. Вот маршрут, который это делает:
get '/hello/: name' do
"Hello, # {params [: name]}!"
end
Вы можете увидеть результат на http://first20hours.com/hello/name. Попробуйте заменить «name» своим именем. Работает!
Это приложение позволяет серверу посмотреть, что содержится в параметре маршрута «name», и использовать это значение. Команда маршрута представляет собой простую инструкцию — показать параметр «name» пользователю.
Sinatra позволяет вам дать название параметру (например, name), но также имеет «универсальный» параметр (его также называют «решеткой» (splat)), который может содержать все что угодно. Вот как можно использовать его в нашем модифицированном приложении «Hello»:
get '/hello/*' do
"Hello, # {params [: splat]}!"
end
Это очень удобно. С помощью обычных и универсальных параметров можно прописывать самые замысловатые маршруты. Создаваемые вами маршруты определяют работу приложения Sinatra.
Этих сведений достаточно, чтобы понять, как написать программу, которая удовлетворяет моему целевому уровню мастерства. Поскольку Jekyll создает файлы, которые приложение предоставляет по запросам пользователей GET, мне остается лишь написать несколько маршрутов, которые принимают эти запросы, находят в системе нужные файлы и предоставляют их читателю.
Как указывается в документации на Jekyll, программа помещает законченные веб-страницы в папку под названием «site» в корневом каталоге. Маршрут к этой странице автоматически генерируется Jekyll. Если мы хотим, чтобы наша страница About была доступна на http://example.com/about, мы ставим маршрут /about в файлах Jekyll, и программа создаст файл в _site/about/index.html в корневом каталоге нашего сайта.
Это означает, что я должен создать новый маршрут в Sinatra, чтобы прочесть файл в ответ на запрос пользователя GET. Вот как он будет выглядеть:
# Index handler
get '/?' do
## File.read ("_site/index.html")
end
# Post handler
get '/*/?' do
## File.read ("_site/# {params [: splat]} /index.html")
end
Команда File.read (“”) встроена в Ruby. File — это объект, read — метод. Используется она очень просто: содержимое (“”) указывает на расположение файла, который должна прочитать программа, относительно корневого каталога приложения. Легко.
А что если такого файла нет? В этом случае необходимо исключение, и в Sinatra встроены два основных маршрута ошибок: not_found и error. Давайте сделаем так, чтобы оба маршрута вызывали одну и ту же страницу с сообщением об ошибке:
not_found do
## File.read ("_site/error/index.html")
end
error do
File.read ("_site/error/index.html")
end
Все остальное остается таким же. Я не собираюсь вносить изменения в config.ru или Gemfile. Я просто добавляю новые маршруты в программный репозиторий Git, внося изменения, а затем размещаю исправленные программы на Heroku. Готово.
Хотите посмотреть, как работает модифицированная программа? Зайдите на сайт PersonalMBA.com: в настоящее время сайт работает на Jekyll вместо WordPress, используя именно эту программу. При помощи программы нагрузочного тестирования, которая называется seige, мой сайт теперь способен без труда обслуживать две тысячи посетителей одновременно. Большинство запросов страниц обрабатываются за 18–20 миллисекунд, так что мой сайт полностью защищен от падения при большом трафике.
Мое первое рабочее интернет-приложение завершено. Мне потребовалось около часа, чтобы разобраться, что я должен делать, и еще час, чтобы понять, как перенести информацию и дизайн моего сайта с WordPress на Jekyll.
Общее время составило около десяти часов, включая исследования и обзор концепций программирования. Не так плохо!
Мое первое приложение работает, и работает хорошо. Оно простое, и в данном случае это его главное преимущество. Чем меньше движущихся деталей, тем меньше вероятность поломки — это справедливо и для программы.
Давайте займемся чем-нибудь чуть более сложным.
Помните наш разговор о базе данных? Главные веб-страницы не могут обновляться, а значит, не могут хранить информацию. Мое первое приложение работает только потому, что файлы статичны: они не изменяются. Любые изменения в файлы вносятся посредством Jekyll, отдельной программы. Приложение получилось быстрым и стабильным потому, что не использует базу данных.