web-dev-qa-db-ja.com

Deviseを使用して、役割に基づいてユーザーのホーム(ルート)パスをリダイレクトするにはどうすればよいですか?

私はプロジェクト管理アプリに取り組んでおり、アプリにはproject_managersclientsがあります。認証/承認にDeviseとCanCanを使用しています。

ログイン後のどの時点で、ユーザーを特定のコントローラー/レイアウト/ビューにリダイレクトする必要がありますか? current_user.roleroutes.rbをチェックし、プロジェクトマネージャーかクライアントかによってルート(またはリダイレクト)を設定する方法はありますか?これは、Deviseのどこかで行うことができる変更ですか?

助けてくれてありがとう! - マーク

24
Mark

君の 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つのエントリポイントを持ち、ロールに応じて適切なコントローラ/アクションにリダイレクトされます。

38
vonconrad

最も簡単な解決策は、lambdaを使用することです。

root :to => 'project_managers#index', :constraints => lambda { |request| request.env['warden'].user.role == 'project_manager' }
root :to => 'clients#index'
19
collimarco

別のオプションは、次のように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 を参照してください。

16

私はこれを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になり、エラーが発生するため、おそらく回避する必要がありますが、これで開始できます。

3