【问题标题】:Sharing data between Sinatra condition and request block在 Sinatra 条件和请求块之间共享数据
【发布时间】:2012-01-04 16:09:05
【问题描述】:

我只是想知道是否有可能有一个条件在完成后将信息传递给请求主体,我怀疑条件可以做到这一点,即使可以做到,也是正确的地方,因为这意味着他们要做条件逻辑,但是授权示例也重定向,因此它有一个模糊的关注点......一个例子是这样的:

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 '/something' do
    @model = Model.new(request.body.data)
end

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

这很好,但是假设我现在有 20 条路线,其中 18 条需要创建这些模型,我需要为所有 18 条基本复制之前的过滤器,并为它们编写相同的模型逻辑,这就是为什么我试图找到一种更好的方法来重用这个功能。如果我可以做一个包罗万象的 Before 过滤器,它能够检查给定的路由是否设置了选项,那么这可能会起作用,但不确定你是否可以这样做。

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

【问题讨论】:

    标签: ruby sinatra action-filter


    【解决方案1】:

    条件可以设置实例变量和修改参数哈希。例如,查看内置的user_agent 条件。

    set(:get_model) { |body| condition { @model = Model.new(body) } }
    
    get '/something', :get_model => something do
      "model called #{@model.name}"
    end
    

    不过,您应该知道 request 在此时不可用。

    【讨论】:

    • 啊,这似乎是我所追求的,感觉有点像黑客,但现在应该没问题。当您说我无法获取请求时,我还能通过 @params[:body] 或其他方式获取请求正文吗?如果不是,那将是一个交易破坏者:(但这超出了这个问题的范围。
    • 抱歉再次发帖,这不是 100% 的主题,但我写了一些代码来检查自定义条件中的 cookie,使用 request.cookies.has_key 似乎可以正常工作? “xxx”。如果您不能在该范围内使用请求,那不应该工作......
    • condition 块中,您可以访问request。但是,当行 get '/something', :get_model => request.body.data 正在评估时,您不需要。
    • 哦!是的,对不起,那很好,我只是在脑海中写下那些东西。谢谢你的回答!
    【解决方案2】:

    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
    

    【讨论】:

    • 是的,我知道,我在上面提到过。但是,要做到这一点,您需要做 2 个路由定义,一个用于您的实际请求正文块,一个用于 before 块。我只想要一个可重复使用的过滤器,如果它定义了一个选项,它会编辑初始帖子,以便在这一点上更清楚。
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2015-10-05
    • 2013-12-10
    相关资源
    最近更新 更多