Rails 3 - reject_if proc不捕获空白字段

时间:2011-12-23 07:41:29

标签: ruby-on-rails ruby-on-rails-3

我被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

变体属性为空白,但项目模型不会拒绝它们。因此所有验证都会通过,使其无法保存。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

在关联时调用buildreject_if的{​​{1}}选项无关。您可以在没有任何参数的情况下调用accepts_nested_attributes_for,因此它会使用默认属性值初始化变体。

在初始化或更新父模型时使用build问题,例如将关联模型(变体)的属性直接传递给父模型(项目):

reject_if

如果item = Item.new :name => "Dans", :variants_attributes => { "0" => { :name => "" } } 为false,您将获得一个具有空名称的变体的新项目。如果reject_ifreject_if,则不会创建此变体,因为传递的所有属性均为空。但是,使用此选项不会阻止您使用true手动创建具有空白属性的变体,或者直接向项目添加变体,如下所示:

build

顺便问一下,为什么在item.variants << Variant.new 行动中致电build?通常edit操作只是获取模型并呈现表单。更新模型的属性发生在edit动作中:

update