私はプロジェクト管理アプリに取り組んでおり、アプリにはproject_managersとclientsがあります。認証/承認にDeviseとCanCanを使用しています。
ログイン後のどの時点で、ユーザーを特定のコントローラー/レイアウト/ビューにリダイレクトする必要がありますか? current_user.role
でroutes.rb
をチェックし、プロジェクトマネージャーかクライアントかによってルート(またはリダイレクト)を設定する方法はありますか?これは、Deviseのどこかで行うことができる変更ですか?
助けてくれてありがとう! - マーク
君の routes.rb
ファイルはユーザーがどのような役割を持っているかわからないため、特定のルートルートを割り当てるために使用することはできません。
できることは、コントローラーをセットアップすることです(たとえば、passthrough_controller.rb
)これにより、役割を読み取ってリダイレクトできます。このようなもの:
# passthrough_controller.rb
class PassthroughController < ApplicationController
def index
path = case current_user.role
when 'project_manager'
some_path
when 'client'
some_other_path
else
# If you want to raise an exception or have a default root for users without roles
end
redirect_to path
end
end
# routes.rb
root :to => 'passthrough#index'
このように、すべてのユーザーは1つのエントリポイントを持ち、ロールに応じて適切なコントローラ/アクションにリダイレクトされます。
最も簡単な解決策は、lambda
を使用することです。
root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
root :to => 'clients#index'
別のオプションは、次のようにprocをauthenticated
メソッドに渡すことです(この例ではrolifyを使用しています)。
authenticated :user, ->(u) { u.has_role?(:manager) } do
root to: "managers#index", as: :manager_root
end
authenticated :user, ->(u) { u.has_role?(:employee) } do
root to: "employees#index", as: :employee_root
end
root to: "landing_page#index"
Rails 4 youhaveで各ルートルートの一意の名前を指定する必要があることに注意してください。 this詳細については、issue を参照してください。
私はこれをWardenを使用するRails 3アプリで行います。DeviseはWardenの上に構築されているので、うまくいくと思いますが、信頼する前に少し実験してください。その上に。
class ProjectManagerChecker
def self.matches?(request)
request.env['warden'].user.role == 'project_manager'
end
end
# routes.rb
get '/' => 'project_managers#index', :constraints => ProjectManagerChecker
get '/' => 'clients#index'
ユーザーの役割が「project_manager」の場合はProjectManagersControllerが使用され、そうでない場合はClientsControllerが使用されます。まったくログインしていない場合は、env['warden'].user
はnilになり、エラーが発生するため、おそらく回避する必要がありますが、これで開始できます。