2016-03-24 18 views
1

私はRails、Active Addmin、cancancanで作業していました。 1つのことを除いてすべてが正常に動作しています。最近、の管理者タイプのユーザーとのクライアントの名前空間を別々に追加しました。現在、私は何とか認証されたユーザーかどうかをチェックされる条件を追加する必要がありますRails、Active Admin、Devise、routes

devise_scope :user do 
    authenticated :user do 
     root :to => 'admin/dashboard#index', as: :authenticated_root 
    end 
    unauthenticated :user do 
     root :to => 'pages#index', as: :unauthenticated_root 
    end 
    end 

は、その変更前に、私は、このような方法で、同じアクティブな管理者ダッシュボード(routes.rbを)にすべての認証済みユーザーをリダイレクト役割がある管理またはクライアントがあります。

私の考えがそのようSTHを作ることだった。

devise_scope :user do 
    authenticated :user do 
     if current_user.role?(:Architect) || current_user.role?(:Admin) 
     root :to => 'admin/dashboard#index', as: :authenticated_root 
     else 
     root :to => 'clients/dashboard#index', as: :authenticated_client 
     end 
    end 
    unauthenticated :user do 
     root :to => 'pages#index', as: :unauthenticated_root 
    end 
    end 

しかし、私はエラーが取得しています:未定義のローカル変数やメソッド `CURRENT_USER」 は私がルート内のユーザーの役割を確認することができますどのように誰もが知っていますか?それを行うための良い方法はありますか?

+0

sessions_controllerカスタムを指定する必要がありアクションフィルタの前にアプリケーションコントローラ。以前はroutes.rbのcurrent_userにアクセスしていません。 –

+0

このアプローチはどうですか? http://stackoverflow.com/questions/31681957/rails-routes-based-on-current-user – exmaxx

答えて

0

ルートは、ルートの定義を担当する設定ファイルである、あなたは、設定ファイル内のすべてのセッション変数にアクセスすることはできません。あなたのルートでDevise::SessionsController

class SessionsController < Devise::SessionsController 

    def after_sign_in_path_for(resource) 
     if resource.role?(:Architect) || resource.role?(:Admin) 
      authenticated_root_url 
     else 
      authenticated_client_url 
     end 
    end 
end 

after_sign_in_path_for方法を使用することができますサインイン後にユーザーをリダイレクトしたい場合は

あなたはあなたはユーザー役割でチェックでき

devise_for :user, :controllers => {:sessions => "sessions"} 
+0

これは私のために働いた。 Muhammadの示唆も貴重ですが、この解決策ではコードの変更はほとんど必要ありませんでした。私はdevise_scopeで始まるブロック全体を削除routes.rbをから 1. ... 2.私が追加: 'devise_for:ユーザー、 コントローラ:{セッション: 'ユーザー/セッション'、 登録:「ユーザーを/登録 パスワード: 'ユーザー/パスワード'}、 path_names:{sign_in: 'ログイン'、sign_out 'ログアウト'} 'Iを添加/users/sessions_controller.rbで – Michal

+0

3: ' DEF after_sign_in_path_for(リソース) if resource.role?(:Architect)|| resource.role?(:管理者) admin_dashboard_path 他 clients_dashboard_path エンド end' – Michal

+0

あなたはまた、ユーザーが手動でURLを入力した場合場合にはフィルタの前に追加する必要があります@Michal。 –

1

ページコントローラ:

class PageController < ApplicationController 

    before_filter :check_route, :only => [:index] 

    def check_route 
    return unless user_signed_in? 
    if current_user.role?(:Architect) || current_user.role?(:Admin) 
     redirect_to :controller => 'admin/dashboard', :action => 'index' 
    else 
     redirect_to :controller => 'clients/dashboard', :action => 'index' 
    end 
    end 
end 

routes.rbを:

root :to => 'pages#index', as: :unauthenticated_root 
関連する問題