在Sinatra条件和请求块之间共享数据

时间:2011-11-23 10:56:49

标签: ruby sinatra action-filter

我只是想知道一旦条件完成后是否有条件将信息传递给请求体,我怀疑条件可以做到并且即使可能也是正确的地方,因为这意味着它们要做条件逻辑,然而授权示例也重定向,因此它有一些关注点......例如:

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

以上都是psudocode,对于任何语法/拼写错误都很抱歉,但我的想法是我可以有一个条件来获取模型并将其放入一些局部变量供主体使用,或者停止并出现错误什么的。

我确信过滤器(之前/之后)是一个更好的方法,如果可以做到这一点,但是从我所看到的我需要设置每条路线,而条件我只需要将它作为请求的选项。

以前的一个例子是:

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

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

这很棒,但是让我说我​​现在有20条路线,其中18条需要这些模型创建,我需要基本上复制前18个过滤器的过滤器,并为它们写所有相同的模型逻辑,这就是为什么我想找到一种更好的方法来重用这个功能。如果我可以执行一个catch-all Before过滤器,它能够检查给定路由是否设置了一个选项,那么这可能会有效,但不确定你是否可以这样做。

在ASP MVC中,您可以使用过滤器来做这种事情,这是我理想情况下的事情,某种方式配置某些路由(在路由定义中)事先做一些工作并将其传递给调用块。

2 个答案:

答案 0 :(得分:2)

条件可以设置实例变量并修改params散列。有关示例,请参阅内置user_agent条件。

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

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

但是,您应该知道request当时不可用。

答案 1 :(得分:0)

Sinatra支持before and after filters

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