2013-12-17 40 views
0

我有以下的用戶模型:find_or_create_by與屬性,它的存在:在Rails的真實

class User < ActiveRecord::Base 

    validates :email, presence:true 
end 

當我這樣做:

@user = User.find_or_create_by(:email => params[:email]) 

我是做@ user.nil?爲了看看用戶是存在的,但它不是作爲心想:

puts @user.inspect 
--> #<User id: nil, email: "", created_at: nil, updated_at: nil> 

爲什麼一個用戶被創建,即使不保存在數據庫?我怎樣才能確保@user是「無」? @ user.id.nil?

感謝

回答

1

未保存用戶記錄,因爲它有一個空白郵件(「」),所以存在驗證失敗。您可以使用@user.errors.full_messages檢查錯誤消息。

如果保存操作失敗(包括驗證),使用活動記錄調用.create(或其派生之一)將返回一條新記錄。如果您希望在用戶記錄無效時發生錯誤,您可以使用.create!,並帶有一聲(!)。我建議這個新的語法這是使用Rails兼容4:你想如何應用程序的行爲

# Raises an Error if no matching record is found and the new record fails to save. 
@user = User.where(:email => params[:email]).first_or_create! 

# Does not raise an error if new record fails to save. The returned object will be a new record with post-validation error states. 
@user = User.where(:email => params[:email]).first_or_create 

您選擇哪種方法依賴。

+0

那麼,我將如何檢查@user是否存在或已經被創建?我不在乎它是否已經創建或位於數據庫中,但我想知道它不是「無」,因此它的ID不是零例如? –

+0

'find_or_create'將*總是*返回一個用戶記錄,所以'@ user'將永遠不會被'nil'。如果用戶有一個ID(不是零),那麼它已經被保存到數據庫。如果你想知道用戶是否是新創建的,你可以使用這個技巧'@ user.instance_variable_get(:@ new_record_before_save)'。 –

+0

聽起來像你可能只需要一個條件,如'if @user && @ user.persisted?' –

1

你可以問,如果它是通過一個新的記錄:

@user.new_record?