我试图修改印象派宝石类“印象”无济于事。
我尝试了以下方法:
class Impression
def hello
"world"
end
end
Impression.class_eval do
end
都在:/app/models/impression.rb 和 /lib/impression.rb (正确配置以包含此文件夹)
我究竟做错了什么?我正在使用 Rails 4。理想情况下,我想添加一个活动记录关联并添加一些辅助方法。
我试图修改印象派宝石类“印象”无济于事。
我尝试了以下方法:
class Impression
def hello
"world"
end
end
Impression.class_eval do
end
都在:/app/models/impression.rb 和 /lib/impression.rb (正确配置以包含此文件夹)
我究竟做错了什么?我正在使用 Rails 4。理想情况下,我想添加一个活动记录关联并添加一些辅助方法。
我假设您正在谈论这个宝石:https ://github.com/charlotte-ruby/impressionist 并且想要更改模型类Impression。
据我所知,它应该是一个rails引擎。
rails 引擎曾经被命名空间,堆栈跟踪可能已经揭示了这一点。
你试过这个吗?
# app/extensions/impressionist/impression.rb
module Impressionist
class Impression
def hello
"world"
end
end
end
您也可以尝试将代码放入初始化程序中,因为它也可能是加载顺序问题。
尝试这个:
require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression')
class Impression
def hello
"world"
end
end
如果您要覆盖 gem 提供的类,则需要手动要求您的版本以包含您的更改。这通常在初始化程序中完成。
使用您自己的方法扩展模型类应该使用关注点来完成。尝试将其放在文件lib
夹中的文件中,并在初始化程序中要求它:
require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression')
module ImpressionExtensions
extend ActiveSupport::Concern
def some_instance_method
# do some stuff
end
module ClassMethods
def some_class_method
# do some stuff
end
end
end
Impression.send(:include, ImpressionExtensions)
应该以类似的方式向任何模型添加方法。Impressionist 的工作方式有点不同,因为它首先将 Impression 类定义为一个常规的、独立的类,然后覆盖它并使其成为模型。