【问题标题】:Rails, losing flash after redirect_toRails,redirect_to 后丢失闪存
【发布时间】:2009-07-22 14:55:19
【问题描述】:

我不明白为什么我的 flash 消息在 redirect_to 之后消失了。在我看来启动了调试器,flash 变量完全是空的。

flash
=> {}

结果与 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

应用布局:

  - flash.each do |name, msg|
    =content_tag :div, msg, :class => "flash_#{name}"

root_url 是另一个控制器和动作。

【问题讨论】:

  • 您可以发布您要重定向到的 root_url 控制器/操作的代码吗?

标签: ruby-on-rails


【解决方案1】:

当您使用闪信功能时,有两种显示消息的方式:

立即在同一页面加载,并在来自flash['foo'] 的视图中访问:

flash.now['foo'] = "Hello world"

或者在重定向到另一个页面时,可以从flash['notice']访问:

redirect_to root_url, notice: "Hello world"

ruby on rails guides 网站是一个非常好的参考:

http://guides.rubyonrails.org/action_controller_overview.html#the-flash

【讨论】:

    【解决方案2】:

    如果您使用双重重定向(例如,重定向到 root,然后重定向到用户),您需要传递 flash。

    def first_action
      flash[:notice] = "Logged in"
      redirect_to root_url
    end
    
    def second_redirect_action
      redirect_to current_user, flash: flash
    end
    

    【讨论】:

      【解决方案3】:

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

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

      将 CSRF 令牌添加到我的表单中修复了它。

      【讨论】:

        【解决方案4】:

        这是render_component 插件。它打破了 2.3.2 的轨道。

        【讨论】:

        • 我通过注释掉render_component 代码中的两行——flash.discard 和flash.sweep 来解决了这个问题。我不知道这是否是正确的解决方案,但它让我现在可以继续前进。
        • 嗨,我也有同样的问题,卡了半天。我以这种方式闪烁redirect_to new_user_session_url(subdomain: @account.subdomain), notice: I18n.t('accounts.create.success_confirmation'),并且我在会话/新页面上丢失了我的消息。但是,当我在控制器上调试时,我看到带有通知键和值的 flash 对象。您能否详细说明您所做的 render_component 事情。
        【解决方案5】:

        由于我的路由,我的 flash 渲染不适用于 root_url。我将 root_url 重定向到另一个页面,例如 root :to => redirect('[SOME_OTHER_PAGE]')。而不是这个,我只是使用 redirect_to 到另一个资源

        【讨论】:

          【解决方案6】:

          如果您被重定向到另一个动作,请使用 flash 如果您要渲染到相同的动作,请使用 flash.now

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-03
            • 1970-01-01
            • 2014-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-06
            相关资源
            最近更新 更多