在Rails 3.2中使用Devise 2.2.4。
未登录时,我转到url myapp.com/documents,Devise将我重定向到myapp.com/users/sign_in,并在devise.failure.unauthenticated下显示devise.en.yml中配置的flash消息。
这是可取的!
当没有登录时,我转到url myapp.com(根路径),Devise重定向类似并显示相同的flash消息。
重定向仍然是可取的,闪存消息不是那么多。
如果从根路径重定向,是否有办法将Devise配置为不显示flash'unauthenticated'消息?我知道我可以在自定义的FailureApp中解决它,但这似乎是一个很常见的情况,应该存在一个更简单的解决方案。
答案 0 :(得分:8)
您可以在重定向后删除SessionsController中的Flash消息。
class SessionsController < Devise::SessionsController
before_filter :remove_authentication_flash_message_if_root_url_requested
private
def remove_authentication_flash_message_if_root_url_requested
if session[:user_return_to] == root_path and flash[:alert] == I18n.t('devise.failure.unauthenticated')
flash[:alert] = nil
end
end
end
答案 1 :(得分:1)
您可以将before_filter :authenticate_user!
或您使用的内容替换为您自己的代码,但不会设置该消息。
答案 2 :(得分:1)
I don't think a simpler solution exists。你可以像Speransky Danil那样说,或者你可以使用自定义的FailureApp。它并不复杂,但它很脆弱,因为你必须覆盖一个调用其他方法的方法,这些方法可以在未来的Devise版本中进行更改:
# app/config/initializers/devise.rb
class CustomFailure < Devise::FailureApp
def redirect
store_location!
if flash[:timedout] && flash[:alert]
flash.keep(:timedout)
flash.keep(:alert)
elsif attempted_path != root_path
flash[:alert] = i18n_message
end
redirect_to redirect_url
end
end
Devise.setup do |config|
config.warden do |manager|
manager.failure_app = CustomFailure
end
end
所以我会选择Speransky Danil的建议。
答案 3 :(得分:1)
不幸的是,真正的问题已经证明是特定于应用程序的。如果用户未登录,则根路径将路由到控制器,该控制器会破坏Devise的行为并根据自定义环境执行自己的重定向。这些重定向是指Devise根据其拥有的信息进行捕获和正确处理。
感谢您的投入。我将把Speransky的评论标记为答案,因为从技术上讲,这就是我们已经在做的事情。
答案 4 :(得分:0)
这对我有用
# app/lib/custom_failure_app.rb
class CustomFailureApp < Devise::FailureApp
def route(scope)
flash.clear
super
end
end
# config/initializers/devise.rb
Devise.setup do |config|
config.warden do |manager|
manager.failure_app = CustomFailureApp
end
end
答案 5 :(得分:0)
我只是去了devise.en.yml
并删除了unauthenticated
消息,将其保留为:
unauthenticated: ""