2011-12-23 78 views
2

我越來越被reject_if拒絕。的Rails 3 - reject_if PROC不要再追空字段

的Item模型的has_many變體,與該模型還接受嵌套屬性:

accepts_nested_attributes_for :variants, :allow_destroy => :true, 
    :reject_if => :all_blank 

當我提交,它張貼以下參數:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"66areo4waM82H66771RkUD/Zt3rrp8Hgk/mwOqV42YI=", "item"=>{"name"=>"Dans", "body"=>"adsdsa", "visible"=>"1", "sellable"=>"0", "variants_attributes"=>{"0"=>{"name"=>"", "price"=>"", "qty"=>"", "sku"=>"", "_destroy"=>"false"}}}, "commit"=>"Save Item", "id"=>"6"} 

爲了參考,所述控制器:

def edit 
    @item = Item.find(params[:id]) 
    @item.variants.build 

變體屬性是空白的,但他們沒有被採用t拒絕他的物品模型。因此,所有的驗證才能通過,使之無法保存。有任何想法嗎?

回答

3

打電話build關聯與reject_if選項accepts_nested_attributes_for沒有任何關係。你叫build不帶任何參數,因此初始化與默認屬性值的變異。

使用reject_if無論你什麼時候初始化或更新關聯模型(變體)直接到父模型(項目)一樣,通過你的父模型屬性:

item = Item.new :name => "Dans", :variants_attributes => { "0" => { :name => "" } } 

如果reject_if是假的,你會得到新的項目一個變體具有空名稱。如果reject_iftrue作爲傳遞的所有屬性都是空白的這個變體將不會被創建。

item.variants << Variant.new 

順便說一句,你爲什麼叫你edit行動build:但是使用這個選項使用手動build或直接添加變體一樣,該項目不會阻止您創建空白屬性的變種?通常edit行動只是取模型,並呈現形式。更新模型的屬性發生在update這樣的動作中:

@item = Item.find params[:id] 
@item.update_attributes params[:item]