我正在使用acts_as_taggable_on
宝石,并想向其中一个宝石源文件(tag.rb
)添加方法,但我不想以任何方式更改宝石来源。如何在不编辑宝石来源的情况下将方法添加到红宝石宝石中?
我试图创造我自己的tag.rb文件在/app/models
目录或/lib
目录,然后添加到该文件所需的方法期待的是红宝石将合并这两个tag.rb文件
但当我做我得到一个NoMethodError: undefined method
...
我错过了什么?
我正在使用acts_as_taggable_on
宝石,并想向其中一个宝石源文件(tag.rb
)添加方法,但我不想以任何方式更改宝石来源。如何在不编辑宝石来源的情况下将方法添加到红宝石宝石中?
我试图创造我自己的tag.rb文件在/app/models
目录或/lib
目录,然后添加到该文件所需的方法期待的是红宝石将合并这两个tag.rb文件
但当我做我得到一个NoMethodError: undefined method
...
我错过了什么?
我认为你是对的,重新开放标签类是要走的路。除非它真的对您的代码有意义,否则我不会引入其他级别的继承。
我不确定,为什么重新打开Tag类不起作用。一些想法:
1 - 当你编写你自己的标签类,它是从ActiveRecord :: Base下降吗? Tag类作为taggable的作用,我可以看到如何忽略这可能会搞砸了。
2 - 如果我需要一个地方放置代码,重新打开一个插件类的单个方法,我可能会把它放入一个初始化文件(如config/initializers/tag_patch.rb)。只是为了保持干净。
3 - 如果一切都失败了,并且仍然无法正确重新打开Tag类(无论出于何种原因),还有其他元编程技术可能会尝试添加该方法。例如:
Tag.send(:define_method, “method_name”) do
#code for your method
end
这似乎工作。我猜你的观点#2是神奇的。将代码放入初始化程序可能是我需要的(尽管我认为我可以将我的tag.rb放在/ lib中)。 – rswolff
class_eval有什么问题,似乎是重新开课的更好更清晰的方式。 – nitecoder
我认为railsninja是正确的,Tag.class_eval可能是最清晰的方法。当我写出define_method示例时,它不会发生。 – PreciousBodilyFluids
等待,你不应该添加方法到文件,但的类代替。您是否熟悉reopening the class的概念?您不能仅通过将文件命名为原始类定义的文件来添加方法。幸运的是, :)
对于我未受教育的答案道歉,我点击了“删除”它,所以希望它会死于一个可怕的死亡。 我不知道重新开放Ruby的可能性,因此我的答案。 – Makis