2014-02-26 51 views
11

之間說在Rails 4應用程序,我有以下幾點:如何使用設計的寶石在一個Rails應用程序在「用戶」被分成了三個模型

class Person < ActiveRecord::Base 
    has_many :email_addresses, as: :emailable 
    has_one :user_account 
end 

class EmailAddress < ActiveRecord::Base 
    belongs_to :emailable, polymorphic: true 
    # There is an :address column 
end 

class UserAccount < ActiveRecord::Base 
    belongs_to :person 
end 

一個人可以擁有多個電子郵件地址。一個人也可以有一個用戶帳戶。 (我已經將它移入它自己的模型中,因爲不是所有的人都會成爲用戶。)登錄時,任何人的電子郵件地址都可以用作「用戶名」。

鑑於此,我想使用設計寶石。我看到您可以指定應用身份驗證的模型。 User被廣泛使用,但我會使用UserAccount。然而,設計然後期望電子郵件(用戶名)字段在這個模型。

當一個人註冊一個用戶帳戶時,實際上會創建三個關聯記錄(Person,EmailAddress和UserAccount)。我無法弄清楚如何讓Devise使用這個設置。有任何想法嗎?謝謝你的幫助。

回答

4

一種選擇是,將電子郵件方法從您的UserAccount委派給您的電子郵件模型並覆蓋設計登錄過程使用的查找器def self.find_first_by_auth_conditions(warden_conditions)。我發現一個很好的描述這個深度的blog post和另一個stackoverflow answer有相同的方法。還有a section in the docs關於如何確認多個電子郵件的設計帳戶。

由於您的設置有點複雜,您也可以使用EmailAddress作爲您的主要設計模型,並將密碼方法委託給UserAccount
如果您必須確認每個具有可確認的電子郵件地址,而不僅僅是用戶帳戶,這可能會很有用。這個設置會讓你重寫那個發現者,但是你可能會遇到其他問題,就像以前從未嘗試過的那樣,使用委託密碼。

1

如果您正在使用ActiveRecord,

首先,添加

attr_accessor :email 

user_account(我認爲這是對付色器件形式最簡單的方法)

接下來,你需要修改設計登錄程序。不過,在你的USER_ACCOUNT,覆蓋色器件等方法

def self.find_for_database_authentication(warden_conditions) 
    conditions = warden_conditions.dup 
    if email = conditions.delete(:email) 
     where(conditions.to_h).includes(:email_addresses).where(email_addresses: {email: email}).first 
    else 
     where(conditions.to_h).first 
    end 
    end 

您可能還需要定義如下得到工作上面

class UserAccount < ActiveRecord::Base 
    belongs_to :person 
    has_many :email_addresses, through: :person 

這應該只是工作的代碼,我已經測試了這個使用活動記錄但如果你使用的是mongoid,那麼解決方案可能會有所不同。

請注意,我修改了devise的How To: Allow users to sign in using their username or email address文檔中的代碼以獲取解決方案。

相關問題