2008-12-30 83 views
0

我有一個擁有多個地址的用戶模型。現在我的應用程序在rails中,地址不是必需的。所以,如果有人想創建一個用戶並在用戶創建後輸入地址,我的應用程序應該允許這樣做。我的問題是,對於地址模型,我對地址欄1,城市和郵政編碼進行了驗證。這些字段不能爲空。當,編輯用戶,下面的代碼失敗:Rails ActiveRecord更新問題

user.addresses < < Address.new

Rails的嘗試創建一個新的地址,並觸發一個Insert命令。由於模型中需要驗證,因此這會失敗。如果用戶不在數據庫中,上面的代碼不會失敗。解決此問題的一個辦法是爲用戶的編輯部分創建單獨的form_for綁定。我不想做那個解決方案。有沒有解決方案允許我爲數據庫中已有的用戶對象綁定空的地址對象?

回答

3

爲什麼試圖將一個空的Address對象添加到user.addresses集合?我想你可以簡單地這樣做:

user.addresses << Address.new unless (conditions) 

可惜我不知道你的條件是什麼在這裏,所以它可能是像

user.addresses << Address.new unless params[:address].nil? 

...雖然我的猜測是,你有一個真實的地址對象,而不是僅僅通過在空白Address.new ...

3
user.addresses << Address.new 

此代碼是不會,如果你的地址模型需要的領域工作,反正要設置的,因爲你不蘇pplying一個哈希Address.new

如果要有條件地添加地址,你可能想是這樣的:

if !params[:address].blank? 
    user.addresses.create(params[:address]) 
end 

user.addresses << Address.new(params[:address]) unless params[:address].blank 

如果你真的想創建一個「空」地址對象爲每個用戶(而不是隻有沒有地址的用戶),你可以改變你的驗證,所以他們只會在字段填寫時觸發。

事情是這樣的:

class Address < ActiveRecord::Base 
    validates_presence_of :address1, :if => :non_empty_address? 
    # etc 

    private 
    def non_empty_address? 
    !address1.blank? || !address2.blank || !city.blank? # etc 
    end 
end 

的restful_authentication插件使用類似的方法來確定是否需要用戶的密碼。

+0

這可以幫助我很多。謝謝。 – user49550 2009-01-02 17:58:41