Rails:设计登录错误消息行为

时间:2014-12-03 13:44:18

标签: ruby-on-rails devise

任何人都可以指出我们如何自定义Devise,以便如果未经身份验证的用户访问root_url,则会将其重定向到/ users / sign_in,但不会显示“您需要在继续之前登录或注册”。错误消息?

进一步扩展:如果用户在没有首先进行身份验证的情况下尝试直接访问“更深层次”的URL(/ controller / restricted_action),我们希望显示该消息,但对于将应用程序标记为www.app.com的用户,我们只是想将它们直接重定向到登录页面而不会显示任何错误。

浏览SessionsController(以确定自定义控制器是否可以工作)和其他各种地方,但看不到地方或我们如何以这种方式覆盖行为。

任何建议表示赞赏!

3 个答案:

答案 0 :(得分:1)

如果从" /"重定向,则应该删除闪光警报消息。到" / users / sign_in"。

class ApplicationController < ActionController::Base
  before_action :keep_previous_url
  before_action :no_unauthenticated_alert_if_redirected_from_root

  def keep_previous_url
    session[:previous_url] = request.fullpath
  end

  def no_unauthenticated_alert_if_redirected_from_root
    if request.fullpath == "/users/sign_in" && session[:previous_url] == "/"
      flash.now.alert = nil
    end
  end
end

答案 1 :(得分:0)

@Anthony的上述建议很好。尽管我认为我们可以在此方面进行一些改进。使用以下解决方案,在before_action中仅调用1个ApplicationController(越好越好,因为它被所有人使用),然后在根控制器或主控制器本身中调用一个。 另外,它不会继续在用户会话中不必要地存储previous_url,从而节省了内存。

将此添加到您的ApplicationController

class ApplicationController < ActionController::Base
  before_action :_no_unauthenticated_alert_if_redirected_from_root

  private

  def _no_unauthenticated_alert_if_redirected_from_root
    return if session[:requiring_sign_in_from_root] != true

    session[:requiring_sign_in_from_root] = nil
    flash.clear
  end
end

并将其添加到提供根“ /”网址的控制器:

class HomeController < ApplicationController
  prepend_before_action :_check_if_requiring_sign_in_from_root

  private

  def _check_if_requiring_sign_in_from_root
    session[:requiring_sign_in_from_root] = true unless user_signed_in?
  end
end

这些方法不必是私有的,但是我认为这是一个好习惯。

答案 2 :(得分:0)

我已通过以下操作解决了此问题:

...this.filtersList.map((f) => f.filtersChanges)

现在我在转到根路由时没有出现错误消息。

来源:https://github.com/heartcombo/devise/wiki/How-To:-Require-authentication-for-all-pages