递归方法无法在Rails中工作

时间:2016-06-08 08:54:07

标签: ruby-on-rails ruby

我在Hash上有一个方法1,用于删除值为空的键值对。它也可以递归地嵌套哈希值。

class Hash
  def delete_blank
    delete_if { |k, v| v.empty? || v.instance_of?(Hash) && v.delete_blank.empty? }
  end
end

从控制台运行它:

{
  "customer_id"=>"foo",
  "document_id"=>"",
  "status"=>"",
  "total"=>{"from"=>"1", "to"=>""}
}.delete_blank
#=> {"customer_id"=>"foo", "total"=>{"from"=>"1"}}

{
  "customer_id"=>"",
  "document_id"=>"",
  "status"=>"",
  "total"=>{"from"=>"", "to"=>""}
}.delete_blank
#=> {} 

我将上面的代码放在lib/core_ext/hash.rb的Rails项目中,然后需要该文件。我试图在模型关注中使用它。但是,它不会删除嵌套哈希中的空白对:

{
  "customer_id"=>"",
  "document_id"=>"",
  "status"=>"",
  "total"=>{"from"=>"", "to"=>""}
}.delete_blank
#=> {"total"=>{"from"=>"", "to"=>""}} 

为什么方法的递归部分在应用程序中无法正常工作(虽然它在rails c中有效)?

1 个答案:

答案 0 :(得分:2)

在某些情况下,Rails使用HashWithIndifferentAccess类,因此我认为您的支票v.instance_of?(Hash)可能是错误的。

解决方法:

class Hash
  def delete_blank
    delete_if { |k, v| v.empty? || v.kind_of?(Hash) && v.delete_blank.empty? }
  end
end