Rails,redirect_to后丢失flash

atm*_*ell 17 ruby-on-rails

我无法弄清楚为什么我的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


Jam*_* EJ 7

如果您使用双重定向(例如重定向到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)


Chr*_*ies 5

我刚刚在 Rails 4 中也遇到了这个问题,在用头撞电脑一段时间后,我在 Rails 日志中注意到了这一点:Can't verify CSRF token authenticity

结果,我通过一个没有 CSRF 令牌的表单提交。令人惊讶的是,它仍在调用我的控制器方法并仍在执行重定向,但这就是导致一切失败的原因。

在我的表单中添加 CSRF 令牌修复了这个问题。


atm*_*ell 4

原来是render_component插件啊 它打破了轨道 2.3.2。