2014-06-24 51 views
0

因此,我正在使用rails構建用戶模型,並且此用戶模型將具有關聯的電子郵件地址模型。電子郵件地址模型在電子郵件上具有唯一性約束。現在我已經設置好了,以便用戶能夠接受_nested_attributes_for:email_address。這適用於創建偉大的,但上更新我得到這個錯誤:更新nested_attributes_for具有唯一性約束的錯誤

u = User.create(:name => "foo", :new_password => "Passw0rd", 
     :email_address_attributes => {:email => "[email protected]"}) 
u.update({:name => "new name", 
     :email_address_attributes => {:email => "[email protected]"}}) 

我如何得到它更新名稱,同時:

ActiveRecord::JDBCError: org.postgresql.util.PSQLException: 
ERROR: duplicate key value violates unique constraint 
"index_email_addresses_on_email" 

我可以通過在軌控制檯做這個重建這個bug不關心email_address。哪些沒有改變?

其他一些筆記和代碼:

我做我的指數EMAIL_ADDRESS電子郵件和我使用的軌道4

class User < ActiveRecord::Base 

    belongs_to :email_address 

    validates :email_address, :presence => true 

    accepts_nested_attributes_for :email_address 
end 

class EmailAddress < ActiveRecord::Base 
    validates_format_of :email, :with => RFC822::EmailAddress 
    validates :email, :presence => true 
    has_one :user 
end 

回答

1

當您更新這樣你email_address_attributes,你實際上添加ew email_address對象爲您的user。您需要將電子郵件地址的ID作爲一個屬性,即:

u.update({:name => "new name", 
    :email_address_attributes => {:id => u.email_address.id, :email => "[email protected]"}}) 

或者,你可以在不同的更新語句

u.update({:name => "new name"}) 
u.email_address.update({:email => "[email protected]"}) 

至於您的控制器更新用戶的電子郵件地址,你需要做的是將電子郵件地址的:id字段添加爲允許的參數。

def user_params 
    params.require(:user).permit(:name, email_address_attributes: [:id, :email]) 
end 

Strong Parameters Rails Guide有更多關於強參數的信息。請查看More Example section以獲取與您的設置類似的設置。

+0

這工作。最主要的是將:id添加到email_address_attributes。我有:電子郵件,但不是:身份證。謝謝。 – NateSHolland

+0

沒問題!我很高興我能幫上忙! –

1

如果你不想驗證,除了電子郵件地址上創建,你可以添加到驗證:

validates :email_address, presence: true, on: :create

1

使用「:update_only」在「accepts_nested_attributes_for」這樣的選項:如果它已經存在,而不是創建一個新的,

accepts_nested_attributes_for :email_address, :update_only => true 

這樣的活動記錄將更新子記錄。這應該考慮到獨特的約束。