【问题标题】:Recursive method not working in Rails递归方法在 Rails 中不起作用
【发布时间】:2016-06-08 08:54:06
【问题描述】:

我在 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
#=> {} 

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

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

为什么该方法的递归部分在应用程序中不能按预期工作(而它在 rails c 中工作)?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    在某些情况下,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
    

    【讨论】:

    • 但这不会使其在rails console 中失败吗?
    • 在控制台中你使用了一个普通的哈希。你可以试试h = HashWithIndifferentAccess.new
    • 你可以使用v.kind_of(Hash),它会正确检测到HashHashWithIndifferentAccessruby-doc.org/core-2.3.1/Object.html#method-i-kind_of-3F
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2013-09-18
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多