设计:从根路径重定向到users / sign_in时,不显示“未经身份验证的”Flash消息

时间:2014-02-07 18:15:47

标签: ruby ruby-on-rails-3 devise

在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中解决它,但这似乎是一个很常见的情况,应该存在一个更简单的解决方案。

6 个答案:

答案 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: ""