如何覆盖Devise在未经过身份验证时使用的login_path?

时间:2016-03-07 21:17:17

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

这是我devise路线的样子:

  devise_for :users, :path_names => { :sign_up => "register",
                                      :sign_in => "login",
                                      :sign_out => "logout",
                                          :settings => "settings" },
                    :controllers => { :invitations => 'users/invitations',
                                      :registrations => "registrations" }
  devise_scope :user do
    get "login", to: "devise/sessions#new"
    get "register", to: "devise/registrations#new"
        get "settings", to: "devise/registrations#edit"
    delete "logout", to: "devise/sessions#destroy"
    post "users/invitation/sign_in", to: "users/invitations#invite_sign_in"
    get "confirmations/show"

    authenticated :user do
      root to: 'dashboard#index', as: :authenticated_root
    end

    unauthenticated do
      root to: 'devise/sessions#new', as: :unauthenticated_root
    end
  end

当我rake routes时,我看到了这一点:

login_path  GET /login(.:format)    devise/sessions#new
register_path   GET /register(.:format) devise/registrations#new
settings_path   GET /settings(.:format) devise/registrations#edit

这就是我所期望的。

然而,一旦我将它添加到我的控制器:

before_filter :authenticate_user! 

当未经身份验证的用户尝试访问该资源时,我会获得重定向循环。

这是日志:

5:48:59 web.1              | Started GET "/users/login" for 127.0.0.1 at 2016-03-07 15:48:59 -0500
15:48:59 web.1              | Processing by UsersController#show as HTML
15:48:59 web.1              |   Parameters: {"id"=>"login"}
15:48:59 web.1              | Completed 401 Unauthorized in 8ms (ActiveRecord: 0.0ms)
15:48:59 web.1              | 
15:48:59 web.1              | 
15:48:59 web.1              | Started GET "/users/login" for 127.0.0.1 at 2016-03-07 15:48:59 -0500
15:48:59 web.1              | Processing by UsersController#show as HTML
15:48:59 web.1              |   Parameters: {"id"=>"login"}
15:48:59 web.1              | Completed 401 Unauthorized in 2ms (ActiveRecord: 0.0ms)

如何让它重定向到/users/login,而不是让它重定向到/login

不太确定如何覆盖此特定功能。没有在任何Devise文档中看到它。

感谢。

2 个答案:

答案 0 :(得分:1)

你碰巧在设计路线上有resources :users吗?可能是他们正在干扰设计路线。

同时尝试获取"/login", to: "devise/sessions#new"而不是get "login", to: "devise/sessions#new",看看它是否有效。

答案 1 :(得分:0)

如果我理解正确......你可以写一个自定义的before_filter:

 def user_is_authenticated?
   unless current_user.present?
     # whatever else you want to do
     redirect_to login_path
   end
 end

Lmk如果这不是你的意思。