このサイトの Devise RDocs である Google を検索して、質問に対する回答を探しましたが、うまくいきませんでした。
4 つの Devise スコープ/ロールがあり、それぞれに独自の属性、ログイン ページ、および個別の Web フローがあるとします。
- 学生
- 教授
- 学部長
- 学部
これらはすべて User クラスを使用し、次の属性が共通しています。
- ID
- 名前
- Eメール
- パスワード
- 役割
これを設定するために確立したルートの例を次に示します。
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 スコープのビューを生成し、それらをいじってみました。
その後、アプリケーション コントローラーにコードを追加して、すべてをルート パスにルーティングする 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
signed_in?などの優れたヘルパーにアクセスできますか? 上記のスコープのいずれかのユーザーがログインしているかどうかがわかります。素晴らしい!!! 現在、 current_userにも同様の機能が必要です。
次のヘルパーにアクセスできます。
- 現在の学生
- 現在の教授
- current_dean
- 現在の教員
それらは完全に機能しますが、ここに問題があります。これらすべてのスコープを共有するビューがあるとします。そのビューで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 の使い方が間違っているか、どこかが欠けているように感じます。