Пока я работал над своей маленькой книгой о Синатре , я выбрал несколько вспомогательных методов, которые предоставляет Синатра. Некоторые из них я уже знал, но мало что использовал, а некоторые даже не знали.
Sinatra имеет множество вспомогательных методов, которые делают его таким приятным для разработчика. Я собрал несколько из них здесь с некоторыми примерами. Некоторые из них могут быть новыми для вас, или, как и я, вы, возможно, слышали о них раньше и просто благодарны за напоминание.
Включить и отключить
Вы можете легко выполнить настройки для всего приложения (или для всего модуля, если вы используете приложение в модульном стиле) в Sinatra, используя метод set
:
set :title, "My Amazing Blog" set :comments, true set :tags ,false
Но если параметры являются логическим значением, вы можете использовать вместо них методы enable
и disable
. Это не только использует меньше кода, но и читает намного лучше.
enable :comments disable :tags
Вы также можете использовать это для встроенных настроек:
enable :logging enable :sessions
Sinatra также создает удобный вспомогательный метод для любых логических настроек, чтобы проверить, верны ли они. В основном это название параметра, за которым следует знак вопроса. Это позволяет нам легко писать и следовать коду, который проверяет, верны ли настройки:
if settings.comments? then display @page.comments redirect to('/') unless settings.?
Какая среда
Следующие методы позволяют проверить, какая среда используется:
production? development? test?
Это означает, что вы можете написать несколько приятных на вид условных операторов, таких как:
require 'sinatra/reloader' if development? run! unless test?
Остановись и пройди
Эти два метода могут использоваться в обработчиках маршрутов для управления циклом HTTP-запросов. halt
остановит запрос в его треках, с дополнительным сообщением или просмотром и кодом состояния. Его можно использовать, если процесс занимает слишком много времени или произошла критическая ошибка. Другое использование включает, если кто-то пытается просмотреть неавторизованную страницу.
get '/important-process' do halt 500 if something_bad_happened? "Everything is okay" end get '/secret-page' do halt 401,"This page is secret" unless logged_in? "For your eyes only" end
Метод pass
можно использовать для передачи метода по цепочке к следующему подходящему маршруту. В приведенном ниже примере у нас есть стандартный маршрут, который говорит «привет», но если имя, введенное в URL, — «daz», тогда я хочу передать запрос более конкретному обработчику маршрута, который будет отображать гораздо более приятное сообщение:
get '/:name' do pass if params[:name] == 'daz' "Hello, #{params[:name]}" end get '/daz' do "Well hello there DAZ!" end
Конечно, в приведенном выше примере было бы проще изменить порядок обработчиков маршрута, но могут быть случаи, когда вы не можете это контролировать.
Request.xhr?
Если вы хотите узнать, был ли сделан запрос с использованием Ajax, тогда Request.xhr?
вспомогательный метод пригодится. Это вернет true, если использовался объект XML HTTP Request. Я часто использую это для перенаправления, если Ajax не использовался, как в примере ниже, который используется для удаления страницы. Если используется Ajax, то страница будет просто удалена, и мы хотим, чтобы пользователь оставался на странице «/ pages», но если Ajax не используется, нам придется вручную перенаправить их обратно на страницу «/ pages»:
delete '/page/:id' do page = Page.get params[:id] page.destroy redirect to('/pages') unless request.xhr? end
Перенаправление назад
Если у вас есть обработчик маршрута, который в основном выполняет операцию, а затем отправляет пользователя обратно на страницу, с которой он пришел, то метод back
helper — это то, что вам нужно, чтобы ваш код читался хорошо. Используемый вместе с вспомогательным методом перенаправления, он просто отправит пользователя обратно на страницу, откуда он пришел. Например, обработчик маршрута удаления страницы, который мы видели:
delete '/page/:id' do page = Page.get params[:id] page.destroy redirect back unless request.xhr? end
Splats
В Sinatra вы можете создавать именованные параметры, помещая перед ними двоеточие в определении маршрута, например:
get '/hello/:name' do end
Это будет хранить все, что введено в месте: name в params[:name]
. Мы можем быть более общими, чем это, и использовать * в маршруте. Это позволяет вводить любое количество текста. Он доступен через params [: splat], например:
get '/goodbye/*/hello/*' do end
URL ‘/ goodbye / shoes / hello / flipflops’ будет содержать параметры [: splat] = [«shoes», «flipflops»]
Вы также можете использовать его с параметрами блока, если вам не нравится слово «сплат». Это также делает ваш код более читабельным и понятным:
get '/*.*' do |path,ext| end
В приведенном выше примере маршрут ‘/application.js’ приведет к появлению переменных path = 'application'
и ext = 'js'
, которые затем можно будет использовать внутри блока обработчика маршрута.
Вы также можете использовать сплат для захвата URL неопределенной длины:
get '/blog/ *' do |path| @page = Page.first(:slug => path.first) end
В приведенном выше примере доступ к маршруту, введенному после ‘/ blog’, можно получить с помощью path.first
. Например, такой маршрут, как «/ blog / all / about / sinatra», приведет к path.first = '/all/about/sinatra'
. Это может быть полезно при работе с такими вещами, как красивые URL-адреса.
Контроль кеша
Вы можете управлять тем, как страницы кэшируются, устанавливая заголовки напрямую, но есть также cache_control
, last_modified
, last_modified
и etag
которые делают управление кэшем last_modified
куском.
Например, если у вас была модель страницы в простой системе CMS, вы могли бы использовать следующее:
get '/page/:id' @page = Page.get(params[:id]) last_modified @page.updated_at etag @page.content markdown @page.content end
Для быстрого и грязного управления кэшем для всех страниц вы можете использовать время запуска приложения, чтобы установить заголовки last_modified
и etag
глобально. Хотя время запуска приложения может не совпадать с фактическим временем последнего изменения всех файлов, обычно мы можем предположить, что если приложение было перезапущено, то что-то должно было измениться. В этом случае стоит очистить кеш и перезагрузить страницы в любом случае. Чтобы установить время запуска приложения, поместите следующий код в блок настройки:
configure do set :start_time, Time.now end
Это работает, потому что код в блоке конфигурации запускается только один раз при запуске. Теперь мы можем использовать этот параметр для установки заголовков last_modified
и etag
. Настройки — это объект Time
, поэтому его можно использовать для заголовка last_modified
, но его необходимо преобразовать в строку, чтобы использовать его для заголовка etag
. Если следующий код помещен в блок before, он будет применен ко всем страницам:
before do last_modified settings.start_time etag settings.start_time.to_s cache_control end
Теперь вы должны получить код состояния 304 вместо 200, если обновляете страницу, которая не была изменена. Это полезный способ снизить нагрузку на сервер в приложении, избегая ненужных обращений к серверу.
Это все люди
Все эти методы делают код намного проще для чтения и обслуживания. Если вы посмотрите на некоторые из приведенных выше примеров кода, они читаются почти как полное предложение на английском языке и очень ясно показывают, что делается. Эти методы также позволяют выполнять аккуратные трюки и использовать меньше кода. В этом прелесть использования Синатры — код короткий и приятный. Большинство из этих вспомогательных методов более подробно описаны в книге. Вы использовали что-нибудь из этого и нашли их полезными, я что-то пропустил? Оставьте свои ответы в комментариях ниже.