Я искал в этом сайте в Google Devise RDocs ответы на мой вопрос, но не повезло.
Допустим, у меня есть четыре области / роли Devise, и у каждой есть своя собственная.атрибуты, страница входа и отдельные веб-потоки:
- Студенты
- Профессора
- Деканы
- Факультеты
Все они используют класс 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
У меня есть доступ к отличным помощникам, таким как Sign_in? , который говорит мне, если какой-либо пользователь в какой-либо изВышеупомянутые области входят в систему. Отлично !!!Теперь мне нужен аналогичный функционал для current_user .
У меня есть доступ к следующим помощникам.
- current_student
- current_prof Professor
- 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
Если этот подход будет работать, я бы это сделал, но кажется крайне неэффективным и утомительным, если я решу добавить больше ролей или общих функций в будущем ...
Должен ли быть лучший способ?Это заставляет меня чувствовать, что я использую Devise неправильно, или просто что-то упускаю.