【问题标题】:how to pass variables between handlers (routes) in sinatra (without flash, sessions, @@class_variable or $global_variable)?如何在 sinatra 中的处理程序(路由)之间传递变量(没有闪存、会话、@@class_variable 或 $global_variable)?
【发布时间】:2012-10-12 22:36:52
【问题描述】:

假设你有:


get '/' do
  haml :index
end

get '/form' do haml :form end

post '/form' do @message = params[:message] redirect to ('/') --- how to pass @message here? end

我希望@message 实例变量在“/”操作中也可用(传递给),所以我可以在haml 视图中显示它。 在不使用会话、闪存、@@class_variable 或数据库持久性的情况下如何做到这一点?

我只想像在方法之间传递值一样传递值。

我不想使用会话 cookie,因为用户可以将它们关闭,我不喜欢它是一个暴露给所有代码的类变量,而且我不需要数据库的开销。

谢谢

编辑:

这是另一个问题,解释了在 Rails 中处理此问题的一种非常简单的方法

Passing parameters in rails redirect_to

以下是我从论坛收集的有关该主题的更多信息,这些信息适用于 Rails,但根据我的经验,不适用于 Sinatra(但请检查一下,因为我可能做错了什么):

如果您在 action1 的末尾重定向到 action2,只需附加 重定向结束的值:

my_var = <some logic>
redirect_to :action => 'action2', :my_var => my_var

在同一线程上,另一个用户提出以下建议:

def action1
  redirect_to :action => 'action2', :value => params[:current_varaible]
end
def action2
 puts params[:value].inspect
end

来源:http://www.ruby-forum.com/topic/134953

这样的东西可以在 Sinatra 中工作吗?谢谢

【问题讨论】:

    标签: variables sinatra action


    【解决方案1】:

    试试

    before do
      @message = params[:message]
    end
    

    @message 应该在任何路由中都可用

    编辑

    post '/form' do
      @message = params[:message]
      #redirect to ('/') --- how to pass @message here?
      haml :index, locals: {msg: @message}
    end
    

    不要使用redirect,那么你可以传递locals 哈希。在您的 index.haml 中,msg 变量应该可用。

    【讨论】:

    • 感谢您提供 2 个不同的解决方案...无论如何,这两个都不是我所需要的...在我的代码中,重定向对于代码一致性和可维护性是必要的,因此最接近的解决方案可能是您的第一个进行了一些调整以使其更加“严格”。但是,我仍然感到难过的是,没有一种标准且安全的方法可以将变量从一条路径传递到另一条路径,例如您在 Rails 中所做的那样。基本上我想传递一个 var,就像你将它从一个函数传递给另一个函数时一样,而不改变固有定义的范围。
    【解决方案2】:

    我能想到的唯一方法就是把东西塞进̀Thread.current[:variableName]。我没有声称这是最好或安全的解决方案。特别是,一旦完成,该哈希条目应该被删除/设置为 nil。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      相关资源
      最近更新 更多