2011-12-23 11 views
2

reject_ifによって拒否されました。モデルとRails 3 - reject_if procが空白のフィールドをキャッチしない

項目モデル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のオプションはとは関係ありません。パラメータなしでbuildを呼び出すと、デフォルトの属性値でバリアントが初期化されます。

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

reject_ifがfalseの場合は、新しいアイテムを取得します:あなたが初期化またはその通過が親モデル(項目)に直接関連モデル(変種)の属性のようなあなたの親モデルが更新されたときにreject_if問題を使用して

1つのバリアントは空の名前を持ちます。 reject_iftrueの場合、渡されたすべての属性が空白であるため、このバリアントは作成されません。

item.variants << Variant.new 

はところで、なぜあなたはあなたのeditアクションでbuildを呼ぶのです。しかし、このオプションを使用すると、手動でそのようなアイテムのバリエーションを追加する直接buildを使用するか、空白の属性を有する変異体を作成してからあなたを防ぐことはできませんか?通常editアクションはモデルをフェッチしてフォームをレンダリングします。モデルの属性を更新すると、updateアクションが発生します。

@item = Item.find params[:id] 
@item.update_attributes params[:item] 
関連する問題