我被reject_if拒绝了。
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
变体属性为空白,但项目模型不会拒绝它们。因此所有验证都会通过,使其无法保存。有任何想法吗?
答案 0 :(得分:3)
在关联时调用build
与reject_if
的{{1}}选项无关。您可以在没有任何参数的情况下调用accepts_nested_attributes_for
,因此它会使用默认属性值初始化变体。
在初始化或更新父模型时使用build
问题,例如将关联模型(变体)的属性直接传递给父模型(项目):
reject_if
如果item = Item.new :name => "Dans", :variants_attributes => { "0" => { :name => "" } }
为false,您将获得一个具有空名称的变体的新项目。如果reject_if
为reject_if
,则不会创建此变体,因为传递的所有属性均为空。但是,使用此选项不会阻止您使用true
手动创建具有空白属性的变体,或者直接向项目添加变体,如下所示:
build
顺便问一下,为什么在item.variants << Variant.new
行动中致电build
?通常edit
操作只是获取模型并呈现表单。更新模型的属性发生在edit
动作中:
update