2013-12-18 41 views
0

動態根我有三個型號如下:用於身份驗證的多態屬性

user.rb

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    belongs_to :role, polymorphic: true 

    validates_presence_of :first_name, :last_name, :email, :password, 
    :password_confirmation 
end 

student.rb

class Student < ActiveRecord::Base 
    has_one :user, as: :role, dependent: :destroy 

    accepts_nested_attributes_for :user 
end 

teacher.rb

class Teacher < ActiveRecord::Base 
    has_one :user, as: :role, dependent: :destroy 

    accepts_nested_attributes_for :user 
end 

我有用戶註冊和登錄按預期工作。然而,我無法弄清楚如何,當他們正在登錄用戶引導到相應的網頁

我處理路由認證用戶如下:

authenticated :user do 
    root to: "students#home", as: :user_root 
end 

理想的情況下,如果當前用戶的role屬性是學生,那麼它將students#home設置爲:user_root。如果它是一個老師,然後設置teachers#home:user_root。有沒有什麼辦法可以純粹處理路線?

回答

1

在使用AJcodez的解決方案時,一些諸如用戶身份驗證等操作並不令人愉快。我最終選擇了我的原始實施。

一個較小的約航線知道的事情是,他們可以在他們有lambas。我們的路線最終看上去像下面這樣:

authenticated :user, lambda { |u| u.role_type == "Student" } do 
    root to: "students#home", as: :student_root 
end 

authenticated :user, lambda { |u| u.role_type == "Teacher" } do 
    root to: "teachers#home", as: :teacher_root 
end 
1

他們的方式你已經結構似乎混淆了我。老師和學生真的有多少共同點?學生和老師是否需要不同的社團,領域和一切?

爲什麼不能有不同的色器件範圍完全獨立的學生和教師模式?請參閱設計wiki配置多個型號:https://github.com/plataformatec/devise#configuring-multiple-models

對於共享功能,您可以同時從一個抽象模型繼承或使用關注點/模塊來實現共享功能。

module DeviseConcern 
    extend ActiveSupport::Concern 

    included do 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    validates_presence_of :first_name, :last_name, :email, :password, 
     :password_confirmation 
    end 
end 
+0

我主要選擇了一個多態的用戶,因爲老師和學生應登錄並通過相同的形式註冊,因爲他們的行爲非常相似,但同樣沒有足夠的STI。我們以前有兩個獨立的模型,發現我們寫重複的代碼,並引入潛在的bug(如果老師有相同的電子郵件作爲一個學生嗎?我們怎麼把手登錄呢?)。 我的實現很大的啓發來自http://stackoverflow.com/questions/7299618/multiple-user-models-with-ruby-on-rails-and-devise-to-have-seperate-registration –

+0

你覺得兩個當分享大多數功能並通過相同的表單登錄時,單獨的模型仍然最有意義? –

+0

如果您使用關注和rspec共享示例,則無重複代碼。 Devise默認情況下不使用作用域視圖,所以這不是問題。那麼,用戶和老師可能會有相同的電子郵件,這將如何呢? – AJcodez