Обмен данными между условием Синатры и блоком запроса - PullRequest
1 голос
/ 23 ноября 2011

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

set(:get_model) { |body|  { send_to_request_body(Model.new(body)) } }

get '/something', :get_model => request.body.data do
    return "model called #{@model.name}"
end

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

Я уверен, что фильтры (до / после) были бы лучшим способом сделать это, если бы это можно было сделать, однако из того, что я видел, мне нужно было бы установить это для маршрута, тогда как с условием, которое мне понадобилось бы только иметь его в качестве опции по запросу.

Пример с before будет:

before '/something' do
    @model = Model.new(request.body.data)
end

get '/something' do
    return "model called #{@model.name}"
end

Это замечательно, но, скажем, у меня теперь было 20 маршрутов, и 18 из них требовалось создать эти модели, мне нужно было бы в основном продублировать фильтр before для всех 18 и написать одинаковую логику модели для всех них, Вот почему я пытаюсь найти лучший способ повторно использовать эту функцию. Если бы я мог сделать фильтр всеохватывающего до, который смог бы проверить, есть ли у заданного маршрута установленный параметр, то это могло бы сработать, но не уверен, что вы можете это сделать.

В ASP MVC вы могли бы делать такие вещи с фильтрами, а это то, чем я в идеале буду заниматься, каким-то образом настраивать определенные маршруты (в определении маршрута), чтобы выполнить некоторую работу заранее и передать ее в вызывающий блок.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Условия могут устанавливать переменные экземпляра и изменять хэш параметров. Для примера, смотрите встроенное условие user_agent .

set(:get_model) { |body| condition { @model = Model.new(body) } }

get '/something', :get_model => something do
  "model called #{@model.name}"
end

Вы должны знать, что request пока недоступен.

0 голосов
/ 23 ноября 2011

Sinatra поддерживает до и после фильтров :

before do
  @note = 'Hi!'
  request.path_info = '/foo/bar/baz'
end

get '/foo/*' do
  @note #=> 'Hi!'
  params[:splat] #=> 'bar/baz'
end

after '/create/:slug' do |slug|
  session[:last_slug] = slug
end
...