Rails在会话中失踪

时间:2015-03-18 12:40:23

标签: ruby-on-rails

我从Rails 3.2升级到4.0,现在重定向后我的flash消息都没有。

我检查过以确保我显示 flash消息的方式不成问题。不涉及重定向的Flash消息可以正常工作。

会话中缺少Flash

我挖了它,发现了一些有趣的东西。如果我将Pry放在我重定向到的控制器操作上,我可以看到session["flash"]nil。我不相信session["flash"]当时应该nil

如果我将session.keys输入控制台,它会显示我:

["session_id", "kmq", "warden.user.user.key", "_csrf_token", "foo"]
# "foo" is something I added myself as a test

是否应该有一个名为"flash"的会话密钥?

env

中缺少Flash

我查看FlashHash source code,我发现Flash消息显然不仅会保存到会话中,还会保存到@env。所以我进行了以下实验。

# I'm manually setting a flash message
> flash[:notice] = "hello"

# Now I'm checking for the flash message in env
> env["action_dispatch.request.flash_hash"]

=> #<ActionDispatch::Flash::FlashHash:0x007fda544718b0
@discard=#<Set: {}>,
@flashes={:notice=>"hello"},
@now=nil>

# Now I'm checking for it in the session
> session["flash"]
=> nil

然后,如果我对我的重定向所针对的控制器操作进行了撬动,我可以这样做:

> env["action_dispatch.request.flash_hash"]

它返回nil

有时候,会话永远不会

我的HashFlash显然有时会envsession 永远不会。事实上,它永远不会进入session,这可能会让我感觉不正确。

我的重定向代码

def update
  user_params.delete(:password) if user_params && user_params[:password].blank?
  if user.update_attributes(user_params)
    respond_to do |format|
      format.html do
        redirect_to(user_account_path(user, anchor: params[:tab]), notice: "Your account has been updated")
      end
      format.js
    end
  else
    render :show
  end
end

我知道控件正在进行重定向。我也尝试过将代码更改为没有运气。

def update
  # Redirect right away to kill the extra moving parts
  redirect_to(user_account_path(user, anchor: params[:tab]), notice: "Your account has been updated")
  return

  user_params.delete(:password) if user_params && user_params[:password].blank?
  if user.update_attributes(user_params)
    respond_to do |format|
      format.html do
        redirect_to(user_account_path(user, anchor: params[:tab]), notice: "Your account has been updated")
      end
      format.js
    end
  else
    render :show
  end
end

所以我的问题是:如何才能让我的Flash消息再次发挥作用?

修改:当我手动将session["flash"]设置为flash.to_session_value时,会出现Flash消息,但它会永久地停留在&#34;卡在&#34上;。但这似乎是一个线索。

编辑2 :我通过对已知工作项目进行一些检查,了解到session["flash"]在分配值后永远不会出现flash[:notice] session(或其他任何关键字)。显然,在控制器操作返回后,flash消息只会插入rake middleware。所以这解决了这一部分的神秘感。

编辑3 :FWIW,这里是use Airbrake::UserInformer use Rack::Sendfile use ActionDispatch::Static use Rack::Lock use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fcc23268eb8> use Rack::Runtime use Rack::MethodOverride use ActionDispatch::RequestId use Rails::Rack::Logger use ActionDispatch::ShowExceptions use ActionDispatch::DebugExceptions use BetterErrors::Middleware use Airbrake::Rails::Middleware use ActionDispatch::RemoteIp use ActionDispatch::Reloader use ActionDispatch::Callbacks use ActiveRecord::Migration::CheckPending use ActiveRecord::ConnectionAdapters::ConnectionManagement use ActiveRecord::QueryCache use ActionDispatch::Cookies use ActionDispatch::Session::ActiveRecordStore use ActionDispatch::Flash use ActionDispatch::ParamsParser use Rack::Head use Rack::ConditionalGet use Rack::ETag use Warden::Manager use ActionDispatch::Cookies use ActionDispatch::Session::CookieStore use OmniAuth::Builder run DueProps::Application.routes 的输出:

{{1}}

我不知道这是否提供了任何线索。

1 个答案:

答案 0 :(得分:2)

我找到了罪魁祸首。有人在config/application.rb中添加了此内容:

use ActionDispatch::Cookies
use ActionDispatch::Session::ActiveRecordStore

因此,rake middleware显示ActionDispatch::CookiesActionDispatch::Session两个:

use ActionDispatch::Cookies
use ActionDispatch::Session::ActiveRecordStore

use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore

删除这两行后,flash消息再次发挥作用。

我要感谢@jbgo,因为他的评论是我解决问题的原因。