我一直在此站点上的 Devise RDocs、Google 中搜索我的问题的答案,但没有运气。
假设我有四个 Devise 范围/角色,每个都有自己的属性、登录页面和单独的 Web 流:
- 学生们
- 教授
- 院长
- 院系
所有这些都使用 User 类并具有以下共同属性。
- ID
- 姓名
- 电子邮件
- 密码
- 角色
这是我为设置它而建立的路线示例:
devise_for :students, :class_name => 'User'
devise_for :professors, :class_name => 'User'
devise_for :deans, :class_name => 'User'
devise_for :faculties, :class_name => 'User'
devise_for :users
然后我生成了设计范围的视图并使用了这些视图。
之后,我必须在我的应用程序控制器中添加一些代码来覆盖 Devise::RegistrationsController,它希望将所有内容路由到根路径:
def after_sign_in_path_for(resource)
user_role = resource.role
case user_role
when "professor"
professors_url
when "faculty"
faculties_url
when "dean"
deans_url
when "student"
students_url
else
root_path
end
end
def after_sign_out_path_for(resource)
case resource
when :faculty
new_faculty_session_path
when :professor
new_professor_session_path
when :dean
new_dean_session_path
when :student
new_student_session_path
else
root_path
end
end
我可以使用出色的助手,例如签到?它告诉我是否有任何上述范围内的用户登录。太好了!!!现在我需要current_user的类似功能。
我可以访问以下助手。
- 现在的学生
- 当前教授
- current_dean
- current_faculty
它们工作得很好,但这是我遇到问题的地方。假设我有一个共享所有这些范围的视图。现在,如果我在该视图上尝试current_student并且我以教授身份登录,它将无法正常工作。
例如:我想在每个页面上包含一个部分,以允许用户在登录后注销。这就是我为学生做的事情。工作得很好。
<% if student_signed_in? %>
<div style="float: right;">Welcome <%= current_student.name %></div>
<div>
<%= link_to('Logout', destroy_student_session_path, :method => :delete) %>
</div>
<% end %>
我想要做的是这样的事情,它将提供注销我所有范围/资源的能力,无论我是以学生、院长、教授还是教职员工身份登录的:
<% if signed_in? %>
<div style="float: right;">Welcome <%= current_resource.name %></div>
<div>
<%= link_to('Logout', destroy_resource_session_path, :method => :delete) %>
</div>
<% end %>
我的下一步是添加我自己的辅助方法来确定范围,如下所示:
def current_resource
current_professor unless current_professor.nil?
current_student unless current_student.nil?
current_dean unless current_dean.nil?
current_faculty unless current_faculty.nil?
end
def destroy_resource_session_path
destroy_professor_session_path unless current_professor.nil?
destroy_student_session_path unless current_student.nil?
destroy_dean_session_path unless current_dean.nil?
destroy_faculty unless current_faculty.nil?
end
如果这种方法行得通,我会这样做,但如果我决定在未来添加更多角色或通用功能,这似乎非常低效和乏味......
一定有更好的方法?这让我觉得我在错误地使用设计,或者只是在某个地方遗漏了一些东西。