在 Rails 应用程序中扩展哈希类

Mic*_*tor 3 hash ruby-on-rails

我有一个 Rails 应用程序,我需要扩展模块Hash以添加方法 -

class Hash
  def delete_blank
    delete_if{|k, v| v.nil? or (v.instance_of?(Hash) and v.delete_blank.empty?)}
  end
end
Run Code Online (Sandbox Code Playgroud)

我创建了一个名为 hash_extensions.rb 的文件,并将其放置在我的 lib 文件夹中,当然还使用以下行配置了自动加载路径config/application.rb

config.autoload_paths += %W(#{config.root}/lib) 
Run Code Online (Sandbox Code Playgroud)

然而,当我在哈希上调用删除空白方法时,出现以下错误 -

undefined method `delete_blank' for #<Hash:0x000000081ceed8>\nDid you mean?  delete_if
Run Code Online (Sandbox Code Playgroud)

除此之外,我还尝试将其放置require "hash_extensions"在我从中调用delete_blank方法的文件顶部。

我在这里做错了什么或者我可以避免扩展哈希以具有相同的功能吗?

Kir*_*rat 6

您可以通过几种不同的方式解决此问题:

  1. 假设hash_extensions.rb位于your_app/lib/extensions. (最好将所有扩展存储在单独的文件夹中),要求所有扩展如下config/application.rb

    Dir[File.join(Rails.root, "lib", "extensions", "*.rb")].each {|l| require l }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 移到hash_extensions.rb下面config/initializers,它应该会自动加载。

  3. 创建一个文件夹(例如libextensionsunder)your_app/app并移至hash_extensions.rb该文件夹,Rails 将负责加载它。