我正在学习 Rails(和 ruby),我想知道是否可以在控制器函数之间传递变量。
基本上,我的问题可以这样恢复:
#controller.rb
def pageA
#assuming @variable is from a form
@variable = "foo"
if @variable == "foo"
redirect_to action: 'pageB'
else
...
end
end
def pageB
#I'd like to reuse @variable in pageB.html.erb
end
可以使用 redirect_to 吗?我应该采取另一种方法吗?
出于好奇,这是一个可以使用缓存解决的问题吗?
这是不可能像你尝试做的那样。 Ruby on Rails - 与许多其他基于服务器的 Web 框架一样 - 基本上为每个请求新鲜开始处理状态。
这意味着:用户请求某些内容(例如调用 pageA),并且当请求另一个页面(例如 pageB)时不会保留任何状态。当您重定向用户时,Rails 会将重定向命令发送回浏览器,然后向 Rails 服务器启动一个新请求。
如果您想保留 state 或其他数据,则必须在 URL 中对其进行编码(或使用会话,例如当您有登录系统时)。
在您的情况下,您可以简单地将来自表单(即
params
数组)的 @variable 添加到重定向:
redirect_to action: 'pageB', variable: @variable
然后,在
pageB
方法中,变量的旧值将再次作为 params[:variable]
可用。
该值将出现在 URL 中。
请注意,您不应使用该方法对密码等敏感数据进行编码。
您可以在Rails 文档
中查看更多使用redirect_to方法的示例