2016-03-24 38 views
1

Rails, Active Addmin ve cancancan ile çalışıyorum. Her şey bir şey dışında iyi çalışıyor. Son zamanlarda benim admin tür kullanıcılar ve istemcileri için ayrı ad alanları ekledim.Raylar, Aktif Yönetici, Devise, rotalar

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 

Şu anda nasılsa ek koşul eklemem gerekiyor doğrulanmış kullanıcı olmadığını kontrol edilecektir:

o değişiklikten önce, böyle bir şekilde aynı aktif yönetici paneline (routes.rb) için yetkilendirilmiş tüm kullanıcılara yönlendirildi admin veya istemci numaralı bir istemciye sahiptir.

Benim fikrim böyle fiil yapmaktı:

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 

Ama hata alıyorum: tanımsız yerel değişken veya yöntem `örnein' anybody rotalara kullanıcının rolünü kontrol edebilirsiniz biliyor mu? Bunu yapmanın daha iyi bir yolu var mı?

+0

sessions_controller özel belirtmek gerekir eylem filtresinden önce applicationcontroller. Daha önce route.rb adresinde current_user erişemedim. –

+0

Bu yaklaşımdan ne haber? http://stackoverflow.com/questions/31681957/rails-routes-based-on-current-user – exmaxx

cevap

0

, sen yapılandırma dosyalarında herhangi bir oturum değişkenleri erişemez. Eğer rotanız içinde 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 

içinde after_sign_in_path_for yöntemi kullanabilirsiniz sende işaretinden sonraki kullanıcıyı yönlendirmek istiyorsanız

sen Sen kullanıcı rolündeki kontrol edebilirsiniz

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

Bu benim için çalıştı. Muhammed'in önerileri de değerlidir, ancak bu çözümde kodda neredeyse hiçbir değişiklik yapılmamıştır. 'devise_for: kullanıcılarını, denetleyicileri: {oturumları: 'Kullanıcılar/oturum', kayıtları: routes.rb itibaren 1. Ben 2. ... devise_scope başlayan ekledim tüm bloğu kaldırıldı 'kullanıcılar/tescilleri, şifreleri: 'kullanıcılar/şifreleri'}, path_names: {sign_in: 'giriş', sign_out: 'çıkış'} 'ı ilave /users/sessions_controller.rb içinde – Michal

+0

3.: ' def after_sign_in_path_for (kaynak) resource.role? (: Architect) || resource.role? (: Yönetici) admin_dashboard_path başka clients_dashboard_path uç Sonu ' – Michal

+0

ayrıca kullanıcı el url girerse durumda filtrenin önce eklemeniz gerekir @Michal. –

1

Sayfa Denetleyici:

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: Kök yolları tanımı sorumlu bir yapılandırma dosyasıdır

root :to => 'pages#index', as: :unauthenticated_root 
İlgili konular