我在ApplicationController
方法中有重定向,并想通过以下方式发送通知:
class ApplicationController < ActionController::Base
def redirect_if_no_user
if current_user.nil?
redirect_to root_path, notice: t('errors.session_expired')
end
end
end
我在其他一些控制器操作中调用redirect_if_no_user
。
不幸的是,在我手动重新加载主页之前,我看不到通知(在我通过该方法重定向到它之后)。 这种行为是有意的吗?有人有想法吗?
答案 0 :(得分:2)
来自rails文档,(http://guides.rubyonrails.org/action_controller_overview.html#the-flash)
默认情况下,向Flash添加值将使它们可用于下一个请求,但有时您可能希望在同一请求中访问这些值。例如,如果创建操作无法保存资源并且您直接呈现新模板,则不会产生新请求,但您可能仍希望使用闪存显示消息。为此,您可以像使用普通闪存一样使用flash.now:
flash.now[:notice] = t('errors.session_expired')
redirect_to root_path
答案 1 :(得分:1)
看起来可能受益于flash.now
。
我遇到了你提到过的问题(重定向没有闪现),我还没有完全解决它。我找到的一件事是使用flash.now
帮助其他人解决问题:
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def redirect_if_no_user
if !user_signed_in? #-> assuming you're using devise
flash.now[:notice] = t('errors.session_expired')
redirect_to root_path
end
end
end
这可能不起作用。如果没有,我会删除。
答案 2 :(得分:1)
我之前遇到过这个问题......
您(最终)看到的闪光通知可能不是您认为的闪光通知。
redirect_to root_path
但我敢打赌你的root_path有它自己的重定向,而重定向意味着你已经丢失了闪存通知。当您在root_path上提交时,您正在redirect_if_no_user上进行另一次调用,这次您会看到flash消息。
您通常可以解决此问题(重定向丢失Flash消息后的重定向)
使用flash.keep
方法。
def my_root_path_action
flash.keep
...
end
...如果他们在您的操作被调用之前重定向,则可能需要使用before_action
或before_filter
方法之一。
答案 3 :(得分:0)
flash[:notice] = t('errors.session_expired')
redirect_to root_path
试试。