在使用Devise签到后,是否可以根据角色将用户重定向到不同的页面?它似乎只会重定向到routes.rb中定义的root :to => ...页面。
在使用Devise签到后,是否可以根据角色将用户重定向到不同的页面?它似乎只会重定向到routes.rb中定义的root :to => ...页面。
默认情况下,Devise在其操作之后会路由到根路径。关于如何覆盖这些操作,Devise Wiki上有一篇很好的文章,https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in
或者您可以通过将stored_locations_for(resource)
设置为nil,进一步进行操作,并针对每个动作设置不同的重定向,例如:after_sign_up_path(resource)
、after_sign_in_path(resource)
等。
您可以简单地将此方法添加到您的应用程序控制器中:
def after_sign_in_path_for(resource)
user_path(current_user) # your path
end
def after_sign_in_path_for(resource)
if current_user.role == 'admin'
start_path
else
news_path
end
end
谢谢! - Scott MilellaDevise提供了一个辅助方法after_sign_in_path_for
,可以用于覆盖默认的Devise登录/登录后路由到根路径的设置。
要在登录后重定向到另一个路径,只需将此方法添加到您的应用程序控制器中即可。
#class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
users_path
end
users_path 是您希望将其重定向的路径, User 是对应于 Devise 模型的模型名称。
注意: 如果您在 Devise 中使用了 Admin 作为您的模型名称,则它将是
#class ApplicationController < ActionController::Base
def after_sign_in_path_for(resource)
admins_path
end
另外,如果您为Devise生成了控制器,则可以在sessions控制器中定义此内容。例如,如果您的Devise模型是Admin
,则可以在app/controllers/admins/sessions_controller.rb
文件中定义路由到dashboard_index_path
:
# app/controllers/admins/sessions_controller.rb'
def after_sign_in_path_for(resource)
dashboard_index_path
end
并且在注册控制器 - app/controllers/admins/registrations_controller.rb
文件中:
# app/controllers/admins/registrations_controller.rb
def after_sign_up_path_for(resource)
dashboard_index_path
end
就这些了。
希望这对你有所帮助。
def after_sign_in_path_for(resource)
users_path
end
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :authenticate_user!
protected
def after_sign_in_path_for(resource)
current_user.is_a?(Admin) ? admin_tests_path : (stored_location_for(resource) || root_path)
end
end
在 @Asnad Atta 提供的答案基础上进行扩展:
这是我最终使用的内容。
def after_sign_in_path_for(resource)
if current_user.role == 'admin'
start_path
else
news_path
end
end
我希望每个登录的用户都能首先进入新闻页面。 完成初始登录后,导航栏中的主页会跳转到 start_path(这是我在应用程序中称之为它的名称)。start_path 也在我的 root 中:
这个神奇的 after_sign_in_path_for(resource) 仅在初始登录时覆盖 root to: 路径。
这正是我想要的。
我希望这能帮助节省其他人的时间。 Scott
以下是我认为你在 devise wiki 上寻找的答案: