如何在不编辑gem源的情况下为ruby gem添加方法?

时间:2009-11-24 07:27:00

标签: ruby-on-rails ruby metaprogramming

我正在使用acts_as_taggable_on gem,并希望为其中一个gem源文件(tag.rb)添加一个方法,但我不想以任何方式更改gem源。 / p>

我已经尝试在/app/models目录或/lib目录中创建我自己的tag.rb文件,然后将期望的方法添加到该文件中,期望ruby将合并这两个标记。 rb文件

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

我错过了什么?

2 个答案:

答案 0 :(得分:4)

我认为你重新开启Tag课是正确的。我不介绍另一个级别的继承,除非它对你的代码真的有意义。

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

1 - 当你编写自己的Tag类时,它是从ActiveRecord :: Base下载的吗? Tag类作为标记就可以了,我可以看到忽视这些可能会搞砸了。

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

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

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

答案 1 :(得分:2)

等等,您不应该将方法添加到文件,而应添加到。您熟悉reopening the class的概念吗?您只能通过将文件命名为定义原始类的文件来添加方法。幸运的是。 :)