Статьи

Маленькие помощники Синатры

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

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, если обновляете страницу, которая не была изменена. Это полезный способ снизить нагрузку на сервер в приложении, избегая ненужных обращений к серверу.

Это все люди

Все эти методы делают код намного проще для чтения и обслуживания. Если вы посмотрите на некоторые из приведенных выше примеров кода, они читаются почти как полное предложение на английском языке и очень ясно показывают, что делается. Эти методы также позволяют выполнять аккуратные трюки и использовать меньше кода. В этом прелесть использования Синатры — код короткий и приятный. Большинство из этих вспомогательных методов более подробно описаны в книге. Вы использовали что-нибудь из этого и нашли их полезными, я что-то пропустил? Оставьте свои ответы в комментариях ниже.