我从Rails 3.2升级到4.0,现在重定向后我的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"
的会话密钥?
我查看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
显然有时会env
,session
永远不会。事实上,它永远不会进入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}}
我不知道这是否提供了任何线索。
答案 0 :(得分:2)
我找到了罪魁祸首。有人在config/application.rb
中添加了此内容:
use ActionDispatch::Cookies
use ActionDispatch::Session::ActiveRecordStore
因此,rake middleware
显示ActionDispatch::Cookies
和ActionDispatch::Session
两个:
use ActionDispatch::Cookies
use ActionDispatch::Session::ActiveRecordStore
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
删除这两行后,flash消息再次发挥作用。
我要感谢@jbgo,因为他的评论是我解决问题的原因。