Пение с Синатрой

25 января 2018

Добро пожаловать на Трек 1 «Пение с Синатрой». В этой мини-сериале мы рассмотрим Синатру; небольшая, но невероятно мощная DSL для быстрого создания веб-приложений Ruby. В этой части мы начнем с Sinatra, проведя несколько маршрутов, узнав, как получить доступ к параметрам URL и как отправлять данные POST между страницами.

Если вы еще не работали с Ruby, вы должны проверить сеанс Ruby for Newbies, где Andrew проведет вас через процесс установки Ruby в вашей системе и изучения основ языка.

Первое, что нам нужно сделать, это установить Sinatra RubyGem. Введите в терминал:

gem install sinatra

Также установите драгоценный камень «дробовик», который мы будем использовать позже:

gem install shotgu

В зависимости от того, как вы настроили RubyGems в вашей системе, вам может потребоваться префикс команд установки gem с помощью sudo.


Основные сведения

Откройте текстовый редактор и создайте новый файл с именем basics.rb. Прямо наверху нам нужно потребовать RubyGems и камень Sinatra:

require 'rubygems'
require 'sinatra'

Примечание. Если вы используете Ruby 1.9 (который должен быть;)), вы можете удалить требуемую строку rubygems, так как Ruby автоматически загрузит RubyGems.

Начнем с создания классического «Hello World». Добавьте в файл basics.rb следующее:

get '/' do
  "Hello, World!"
end

Это «Маршрут». Здесь мы говорим Sinatra, что если запрашивается адрес дома или корень, URL '', используя обычный метод GET HTTP, для отображения «Hello, World!».

Теперь, в терминале, давайте запустим сервер, набрав ruby basics.rb. Нам говорят, что Sinatra «вышла на сцену» на порт 4567, и если мы перейдем к http: localhost: 4567 в браузере, мы увидим «Hello, World!».

Итак, давайте попробуем другую страницу:

get '/about' do
  'A little about me.'
end
Всякий раз, когда вы вносите изменения в приложение Sinatra, вам необходимо перезагрузить сервер.

Это означает, что если запрашивается URL-адрес «about» (с использованием метода GET HTTP), «Немного обо мне». будет отображаться.

Всякий раз, когда вы вносите изменения в приложение Sinatra, вы должны перезапустить сервер. Поэтому, чтобы спасти нас от постоянной остановки и запуска сервера во время разработки, мы будем использовать драгоценный камень Shotgun, который мы установили ранее.

Остановить текущий сервер Sinatra с помощью Ctrl-C. Теперь мы можем запускать basgun basics.rb и Shotgun автоматически перезапускает сервер при каждом обновлении страницы. Это полезно, когда мы делаем много работ по разработке, но по мере возобновления всего приложения это может быть медленным.

Как прослушивание Shotgun на другом порту, перейдем к порту 9393 и перейдем к http: localhost: 9393 в вашем браузере. Вы должны увидеть фразу, которую мы установили.


Доступ к параметрам URL

Вы также можете получить доступ к параметрам из URL-адреса. Добавьте в свой файл basics.rb следующее:

get '/hello/:name' do
  params[:name]
end

В этом примере у нас есть маршрут, в котором что-либо после «hello» будет содержаться в массиве params с ключом: name. Массив params содержит все переменные GET и POST. Если вы исходите из фона PHP, это похоже на глобальный массив $ _REQUEST.

В браузере перейдите, например, к http: localhost: 9393 hello dan, и вы должны увидеть отображаемое имя («дан»).

Вы можете включить имя: в строку, обернув ее в $ {...}. Попробуйте заменить строку params [: name] следующим образом:

"Hello there, #{params[:name]}."

Как и следовало ожидать, мы можем использовать все обычные методы Ruby для переменной, такие как.upcase,.reverse и т. Д.

"Hello there #{params[:name].upcase}."

Вы можете настроить маршрут для приема нескольких переменных строки запроса следующим образом:

get '/hello/:name/:city' do
  "Hey there #{params[:name]} from #{params[:city]}."
end

Как и обычные переменные в URL-адресе, Sinatra позволяет включать в себя поиск строк подстановочных запросов, называемых «splat», с помощью звездочки:

get '/more/*' do
  params[:splat]
end

Все, что включено в URL, будет доступно через ключ: splat в массиве params.


Просмотр файлов и POST

Теперь давайте сделаем что-то более интересное. Давайте создадим форму для извлечения данных от пользователя, а затем сделаем что-нибудь с ней. Мы также будем использовать «файл вида», который позволяет разделить разметку для представления в отдельный файл. Добавьте следующий файл в файл basics.rb:

get '/form' do
  erb :form
end

Этот маршрут загрузит файл form.erb ERB (Embedded Ruby) из каталога представлений. Файлы ERB обычно являются нормальными файлами HTML, которые позволяют включать код Ruby внутри тегов, который будет разбираться перед отправкой в браузер - точно так же, как вы добавляете PHP или ASP-код на веб-страницу.

Создайте каталог представлений в той же папке, что и файл basics.rb. И внутри представления создайте файл с именем form.erb со следующим содержимым внутри:

hello from the view

Укажите свой браузер в форме http: localhost: 9393, и вы увидите сообщение, которое мы установили в файле вида.

Теперь мы знаем, что все работает, измените содержимое этого файла на:

<form action="/form" method="post">
  <input type="text" name="message">
  <input type="submit">
</form>

Обновите страницу, и вы увидите форму:

Но введите сообщение в текстовое поле и нажмите кнопку отправки, и вы увидите страницу с ошибкой Sinatra, сообщающую нам, что для этого URL-адреса не существует маршрута.

Возможно, вам интересно, почему это так, поскольку форма отправляется в форму, тот же URL-адрес, на котором находится форма, поэтому не должно быть проблем. Разница в том, что мы извлекаем эту страницу с помощью метода POST HTTP, и, как вы можете видеть на странице ошибок, представленной Sinatra, Sinatra требует другого маршрута для каждого метода HTTP.

Итак, добавьте следующий маршрут в приложение Sinatra:

post '/form' do
  "You said '#{params[:message]}'"
end

Этот маршрут предназначен для метода POST, а не GET. Кроме того, все переменные POST доступны в том же массиве params, что и переменные GET, поэтому мы можем получить сообщение, отправленное с формой. Попробуйте!


Вы могли бы полностью работать для MI5 сейчас!

Так, что дальше? Давайте создадим способ «зашифровать» отправляемое сообщение, чтобы он мог быть прочитан только нашим предполагаемым получателем. Добавьте следующий маршрут в приложение Sinatra:

get '/secret' do
  erb :secret
end

Наверное, вы уже догадались об этом. Этот маршрут загрузит файл представления ERB в views secret.erb. Создайте этот файл вида со следующим:

<h3>Super Secret MI5 Message Encryptor!</h3>
<form action="/secret" method="post">
  <input type="text" name="secret">
  <input type="submit">
</form>

И создайте маршрут для метода POST:

post '/secret' do
  params[:secret].reverse
end

Итак, теперь у нас есть шифр сообщения, который использует специальный «обратный» метод, чтобы сообщение казалось нечитаемым, нам нужен способ расшифровки сообщения:

get '/decrypt/:secret' do
  params[:secret].reverse
end

Вот он! Супер секретный, высокозащищенный шифр сообщений, достаточно хороший для разведывательного агентства любой страны.

Правовая оговорка: когда мы говорим «очень безопасно» и «шифрование», мы фактически просто меняем буквы. Сожалею.


FourOhFour?

Последнее, что мы затронем, - это 404 страницы ошибок. Прямо сейчас, если вы перейдете к URL-адресу, для которого нет маршрута (например, danisthebest), вы увидите сообщение об ошибке Sinatra. В реальном приложении мы хотим отобразить собственную ошибку. Для этого просто используйте маршрут not_found, например:

ot_found do
  status 404
  'not found'
end

Здесь мы используем метод статуса Sinatra для установки кода статуса HTTP на странице 404 (вы можете использовать этот же метод для установки любого кода состояния, например 201, когда что-то создано, или 403, когда логин был неудачным).

Вы можете продолжить рефакторинг маршрута not_found с помощью метода остановки Sinatra:

ot_found do
  halt 404, 'page not found'
end

Заключение

Итак, вы выполнили свой первый дуэт с Sinatra! Надеюсь, вы увидите, как легко DSL создает веб-приложения.

На следующем треке мы создадим простое приложение «to-do», подключенное к базе данных SQLite. Мы также рассмотрим неуловимые методы PUT и DELETE HTTP, о которых никто не слышал.

Примечание. Вы можете просмотреть окончательные файлы проекта для этого руководства в GitHub.