2012-09-11 46 views
1

我爲我的註冊過程使用Devise gem - 我只希望電子郵件是必需的,所以我爲每個用戶自動生成一個密碼。Rails設計Auto_Gen密碼

出於某種原因,我的代碼正在爲單個用戶創建2個數據庫條目。一個 - 帶有電子郵件地址。一個 - 只有加密的密碼。

User.rb

password = Devise.friendly_token 
    User.create!(:email => @current_user_email, :id => @current_user_id, :password => password, :password_confirmation => password) 


    before_save { |user| user.email = email.downcase } 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
+1

你爲什麼要指定引發異常'id'?在幾乎所有情況下,'id'列應該由數據庫自動設置。另外,我假設前2排在控制器中,最下面3排在模型中? 「@ current_user_email」等變量來自哪裏? –

+0

我正在指定id,看它是否會正確傳遞'current_user'參數(來自Devise的幫助程序)。我在模型中使用了所有這些代碼。 – abhir

回答

2

在我的項目之一,我不要求用戶使用密碼來註冊採取了類似的路徑。它已經導致了一些主要的頭痛和UX shenanigans FWIW。

無論您用於持久性,請確保在電子郵件列中設置唯一索引。這會導致異常,但它們很容易處理。

我會像你的用戶模型表明一個類的方法:

class User 
    def self.create_without_password!(email) 
    password = Devise.friendly_token 
    User.create!(:email => email.downcase, :password => password, :password_confirmation => password) 
    end 
end 

這應該驗證模型,而不使用before_save回調和非唯一

+0

不適用於我 - 現在,密碼根本不存儲在數據庫中。看起來可能是這個代碼的位置。我嘗試創建一個註冊控制器並覆蓋'create'方法。 – abhir