我在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
中有效)?
答案 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