【问题标题】:How can I add non-existing class to a exiting module in gem in rails如何将不存在的类添加到rails中gem中的现有模块
【发布时间】:2014-01-17 11:42:17
【问题描述】:

我知道我可以覆盖或添加到已经存在的类,但我想向现有模块(在 gem 中)添加额外的类,以便在调用它时保持不变。因为我虽然当rails加载lib时。他们应该认识到这一点。

请参阅以下示例。我想将 NotAcceptableHttpResponseError 添加到同一个 HttpService 模块中

示例 模块 HttpService(在 gem 中)只有相当数量的异常类,我想为其他人添加一些自定义的类

config/application.rb

config.autoload_paths += %W(#{config.root}/lib)

在 gem/exceptions.rb 中

module HttpService
   class BadHttpResponseError
     xxx
     xxx
   end

在 lib/http_service/exceptions.rb 中

module HttpService
   class NotAcceptableHttpResponseError
     xxx 
     xxx
   end
end

错误

NameError(uninitialized constant HttpServices::NotAcceptableHttpResponseError)

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    Rails 3 不会自动加载 lib 文件

    1) 在 config/application.rb 中添加:

    config.autoload_paths += Dir["#{config.root}/lib/**/"]

    2) 文件夹名与模块名相同,文件名与类名相同(遵循rails命名约定)
    将 exceptions.rb 重命名为类的名称,即 not_acceptable_http_response_error.rb

    添加 config/initializers/require.rb

    require "#{Rails.root}/lib/http_service/exceptions" 
    

    【讨论】:

    • O 忘了提到还有 config.autoload_paths += %W(#{config.root}/lib) 还有 exceptions.rb 是 HttpServer 放置所有异常的内容。所以他们是同名的
    • 那么文件名应该和类名一样。你的班级名称是 NotAcceptableHttpResponseError
    • 你也可以在 config/initializers/require.rb 中使用用户 require "#{Rails.root}/lib/exceptions"
    • 这不是真的。因为这也是 gem 的设置方式,而且我必须添加超过 1 个类,所以类名应该与文件名相同是无效的,因为我不知道应该使用哪些类名
    • 我相信 config.autoload_paths 应该已经加载了 lib 文件夹,所以我认为我不需要添加 require "#{Rails.root}/lib/exceptions"
    【解决方案2】:

    想出了答案。修改 gem 中的模块实际上并不理想。因为你必须在 gem 文件中 fork 项目并在更新时维护版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2018-02-26
      • 2022-01-22
      • 2017-03-24
      相关资源
      最近更新 更多