2

我试图拒绝一个空的表单条目,但我遇到了困难。

用户可以选择现有位置,也可以创建新位置。我希望表单实际显示空字段,但当它们全部为空时拒绝它们。由于 '_destroy' 永远不会为空,我需要例外。此外,如果仅填写数量,则可以拒绝该条目。

表单提交以下信息:

参数:

{"product"=>
        {..., 
        "product_locations_attributes"=>
            {
            "0"=>{"location_attributes"=>{"_destroy"=>"false", "street"=>"", "number"=>"", "zipcode"=>"", "city"=>"", "country"=>""}, "quantity"=>""},
            "1"=>{"_destroy"=>"false", "location_id"=>"", "quantity"=>""}}
            }
        , "commit"=>"Create Product"
        }

AI 试图在 Product 模型中删除空位置,如下所示:

  accepts_nested_attributes_for :product_locations, :allow_destroy => true,
    :reject_if =>  proc {|a| a.except('_destroy', 'quantity').values.all?( &:blank? )}

由于它是嵌套的,因此不能这样工作。那么如何检查除了数量和_destroy之外的所有内容是否都是空白的?应该可以一口气搞定吧?谢谢你的帮助。

*更新以使其更清晰*

4

2 回答 2

0

我会明确检查所有可能为空白或不为空白的字段,而不是尝试做某种“它们都是空白的”。更加明确和可读。

:reject_if =>  proc {|a| 
  location_attributes = a[:location_attributes]
  a[:street].blank? && a[:number].blank? && a[:location_id].blank?
}

从长远来看,它会很冗长,但会更好!

于 2013-05-14T17:24:42.713 回答
0

感谢@RobHeaton 的分析器,我终于能够完成这项工作。Myabe他的回答可以工作,但对我不起作用。如果应该而且我做错了什么,请告诉我,我会接受他的回答。我终于让它与以下代码一起工作:

accepts_nested_attributes_for :product_locations, :allow_destroy => true, :reject_if => :empty_fields

  def empty_fields(a)
    if la = a[:location_attributes]
      la[:street].blank? && la[:number].blank? && la[:city].blank? && la[:zipcode].blank? && la[:country].blank?
    else
      a[:location_id].blank?
    end
  end

现在很清楚什么需要空白才能拒绝。对于我尝试过的其他事情,我最终要么接受了要么拒绝了太多的事情。写下来以防其他人遇到同样的问题。

于 2013-05-16T13:18:31.727 回答