如何覆盖当用户未通过身份验证时Devise使用的login_path?
问题描述:
这是我的devise
路线是这样的:如何覆盖当用户未通过身份验证时Devise使用的login_path?
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 "https://*.com/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 "https://*.com/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文档中看到它。
谢谢。
答
您是否碰巧在设计路线上有resources :users
?可能是他们正在干涉设计路线。
也尝试获得"/login", to: "devise/sessions#new"
而不是get "login", to: "devise/sessions#new"
,看看它是否工作。
+0
移动'资源:用户'为我工作。谢谢! – marcamillion
答
如果我理解正确的话......你可以写一个自定义的before_filter:
def user_is_authenticated?
unless current_user.present?
# whatever else you want to do
redirect_to login_path
end
end
LMK如果这不是你的意思。
你碰巧在'devise'路线上有'resources:users'吗?可能是他们正在干涉设计路线。也可以尝试“get/login”,将:“devise/sessions#new”而不是'get“login”设置为:“devise/sessions#new”,看看它是否有效。 – Dharam
@Dharam我实际上''资源:用户'上面那'设计'路线。我应该将它移动到下面吗?刚试过'/ login /',但没有解决它。 – marcamillion
@Dharam你是对的。一旦我将'resource:users'移到'devise'路径下面,它就可以工作。非常感谢。将其添加为答案,我将接受它。再次感谢! – marcamillion