2011-11-23 57 views
1

我只是想知道是否有可能在请求主体完成时向请求主体传递信息的条件,我怀疑条件是否可以做到这一点,并且即使他们可以做到也是正确的地方,因为这意味着他们做的条件逻辑,但是授权例子也重定向所以它的关注点模糊......一个例子是这样的:在Sinatra条件和请求块之间共享数据

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个,并为他们编写相同的模型逻辑,这就是为什么我试图找到更好的方式来重新使用这个功能。如果我可以做一个全能的过滤器,可以检查给定的路线是否有选项设置,那么这可能会起作用,但不知道你是否可以做到这一点。

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

回答

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在该点不可用。

+0

啊,看起来像什么后,这感觉就像一个黑客,但现在应该罚款。当你说我无法掌握请求时,我是否仍然可以通过@params [:body]或其他方法获得请求主体?如果不是,那么这将是一个交易断路器:(​​但是,这是超出了这个问题的范围 – Grofit

+0

对不起,再次发布,这不是100%的话题,但我写了一段代码一段时间后检查一个cookie自定义条件,这似乎工作正常使用request.cookies.has_key?xxxx。如果你不能使用该范围内的请求不应该工作... – Grofit

+1

在'condition'块,你有权访问' request'。但是,当'get'/ something',:get_model => request.body.data'被评估时,你不需要。 –

0

辛纳特拉有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 
+0

是的我知道,我在上面提到它。但是要做到这一点,您需要执行2个路由定义,一个用于实际请求主体块,另一个用于before块。我只想要一个可重复使用的过滤器,可以被所有的*使用,如果它有一个选项定义,将编辑最初的帖子在这一点上更清晰。 – Grofit