ruby-on-rails - 如何在不编辑 gem 源的情况下向 ruby​​ gem 添加方法?

标签 ruby-on-rails ruby metaprogramming

我正在使用 acts_as_taggable_on gem 并想向其中一个 gem 源文件 (tag.rb) 添加一个方法,但我不想更改以任何方式获取 gem 来源。

我已经尝试在 /app/models 目录或 /lib 目录中创建我自己的 tag.rb 文件,然后向其中添加所需的方法期望 ruby​​ 合并两个 tag.rb 文件的文件

但是当我这样做时,我得到一个 NoMethodError: undefined method ...

我错过了什么?

最佳答案

我认为您是对的,重新打开 Tag 类是可行的方法。除非它对您的代码真正有意义,否则我不会引入另一个级别的继承。

我不确定为什么重新打开 Tag 类不起作用。一些想法:

1 - 当您编写自己的 Tag 类时,它是否继承自 ActiveRecord::Base? Tag 类在 acts as taggable on 上确实如此,我可以看到忽略它可能会把事情搞砸。

2 - 如果我需要一个地方来放置为单个方法重新打开插件类的代码,我可能会把它放在一个初始化文件中(例如 config/initializers/tag_patch.rb)。只是为了保持清洁。

3 - 如果所有其他方法都失败并且您仍然无法正确重新打开 Tag 类(无论出于何种原因),您可能会尝试使用其他元编程技术来添加该方法。例如:

Tag.send(:define_method, “method_name”) do 
  #code for your method
end

关于ruby-on-rails - 如何在不编辑 gem 源的情况下向 ruby​​ gem 添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788440/

相关文章:

ruby-on-rails - Rails 5.1 API - 如何允许嵌套 JSON 对象的属性的参数

ruby-on-rails - 带有 nginx ddos​​ 保护的 Ruby on rails

ruby - 通过文本解析以在 Ruby 1.9.x 中查找 html 标签

python - Ruby 和 Minecraft 数据包

ruby - 帕德里诺教程 : Can't Modify Frozen String (Runtime Error)

ruby - 在模块中扩展类方法

C++ 组合参数模板元编程

ruby-on-rails - Rails 5.0 - 如何在不使用 best_in_place gem 的情况下实现就地编辑

ruby - 在 ruby​​ 类的特征类中设置实例默认值

ruby-on-rails - ExecJS 失败,未定义 CoffeeScript