我无法弄清楚为什么我的flash消息在redirect_to之后消失了.在我的视图中启动了调试器,flash变量完全为空.
flash
=> {}
Run Code Online (Sandbox Code Playgroud)
结果与flash.now相同...如果我编辑一些东西并调用渲染,它的工作正常.
控制器:
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = "Logged in"
redirect_to root_url
else
render :action => 'new'
end
end
Run Code Online (Sandbox Code Playgroud)
应用布局:
- flash.each do |name, msg|
=content_tag :div, msg, :class => "flash_#{name}"
Run Code Online (Sandbox Code Playgroud)
root_url是另一个控制器和动作.
Nic*_*nen 24
使用闪存消息功能时,有两种显示消息的方法:
即时在同一页面加载,并在视图中访问flash['foo']
:
flash.now['foo'] = "Hello world"
Run Code Online (Sandbox Code Playgroud)
或者重定向到另一个页面,并可从flash['notice']
以下位置访问:
redirect_to root_url, notice: "Hello world"
Run Code Online (Sandbox Code Playgroud)
rails指南网站上的红宝石是一个非常好的参考:
http://guides.rubyonrails.org/action_controller_overview.html#the-flash
如果您使用双重定向(例如重定向到root,然后重定向到用户),则需要启用闪存.
def first_action
flash[:notice] = "Logged in"
redirect_to root_url
end
def second_redirect_action
redirect_to current_user, flash: flash
end
Run Code Online (Sandbox Code Playgroud)
我刚刚在 Rails 4 中也遇到了这个问题,在用头撞电脑一段时间后,我在 Rails 日志中注意到了这一点:Can't verify CSRF token authenticity
。
结果,我通过一个没有 CSRF 令牌的表单提交。令人惊讶的是,它仍在调用我的控制器方法并仍在执行重定向,但这就是导致一切失败的原因。
在我的表单中添加 CSRF 令牌修复了这个问题。