Ruby on rails 除了在拒绝中的嵌套哈希上,我如何使用

Ruby on rails 除了在拒绝中的嵌套哈希上,我如何使用,ruby-on-rails,ruby,hash,nested,Ruby On Rails,Ruby,Hash,Nested,我试图拒绝一个空的表单条目,但我遇到了困难 用户可以选择现有位置,也可以创建新位置。我希望表单实际显示空字段,但在它们都为空时拒绝它们。因为“_destroy”永远不会为空,所以我需要破例。此外,如果只填写了数量,则可以拒绝输入 该表格提交以下信息: 参数: {"product"=> {..., "product_locations_attributes"=> { "0"=>{"location_

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

用户可以选择现有位置,也可以创建新位置。我希望表单实际显示空字段,但在它们都为空时拒绝它们。因为“_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正试图在产品模型中删除空位置,如下所示:

  accepts_nested_attributes_for :product_locations, :allow_destroy => true,
    :reject_if =>  proc {|a| a.except('_destroy', 'quantity').values.all?( &:blank? )}
因为它是嵌套的,所以不能像这样工作。 那么,我如何检查除了数量和销毁之外的所有内容是否都是空白的呢? 应该可以一次完成,对吗? 谢谢你的帮助


*更新以使其更加清晰*

我将明确检查所有可能为空或不为空的字段,而不是尝试执行某种“它们都是空的”操作。更加明确易读

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

这将是冗长的,但从长远来看更好

多亏了@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
现在很清楚什么东西需要空白才能被拒绝。在我尝试过的其他事情中,我要么接受了太多,要么拒绝了太多。
只要写下来,以防其他人遇到同样的问题。

您所写的数据是一个
数组。你的意思是提供一个
散列值吗?嗯,很好。也许我需要更深入地了解这一点,以了解我在尝试做什么。
proc
中的Fritzz,
a
就是那个数组吗?我现在更新了这个问题,希望能让它更清楚。谢谢你的回答。我本来打算用一个。除了作为一个更灵活的解决方案,以防新的字段被添加到地址中,但好吧,我喜欢你的论点更详细,可读性也更强。问题是,在此解决方案中,使用现有位置的新产品位置(如原始问题中的产品位置[1])现在也会被拒绝,因为找不到位置属性。至少这就是我现在看到的我正在尝试你的解决方案。。或者是其他问题?没问题-在这种情况下,传递到进程中的属性散列是什么样子的?属性散列有使用新位置或现有位置的产品位置,如:“产品”=>{“产品位置属性”=>{“1”=>{“位置属性”=>{U销毁”=>“false”、“street”=>“Esmoreittracat”、“number”=>“60”、“zipcode”=>“1017 DT”、“city”=>“Amsterdam”、“country”=>“Neverlands”}、“quantity”=>“3”>“2”=>“false”、“location”=>“1”、“quantity”=>,“id”=>“110”},“3”=>“location”=>“location”=>“id”=>“false”、“quantity”=>“3”},“Committee”=>“Create”=>“Create产品”}1是新的,2是现有的,3是无效的。您只需检查
location\u id
是否也为空-请参阅我的更新答案。