从Rails中的印象派宝石中重新打开印象类4

时间:2013-10-11 05:44:15

标签: ruby-on-rails ruby ruby-on-rails-4 monkeypatching

我正在尝试修改Impressionist宝石类“Impression”无济于事。

我尝试了以下内容:

class Impression
  def hello
    "world"
  end
end

Impression.class_eval do
end

两者都在: /app/models/impression.rb 和 /lib/impression.rb(包含此文件夹的配置正确)

我做错了什么?我正在使用Rails 4.理想情况下,我想添加一个活动记录关联并添加一些辅助方法。

4 个答案:

答案 0 :(得分:1)

我假设你在谈论这个宝石:https://github.com/charlotte-ruby/impressionist 并希望更改模型类Impression

从我可以看到它应该是一个rails引擎。

rails引擎用于命名空间,堆栈跟踪可能已经显示了这一点。

你试过这个吗?

# app/extensions/impressionist/impression.rb
module Impressionist
  class Impression
    def hello
      "world"
    end
  end
end

你也可以尝试将你的代码放在初始化程序中,因为它也可能是一个加载顺序问题。

答案 1 :(得分:1)

试试这个:

require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression')

class Impression
  def hello
    "world"
  end
end

答案 2 :(得分:1)

如果您要覆盖gem提供的类,则需要手动要求您的版本来包含更改。这通常在初始化程序中完成。

答案 3 :(得分:1)

使用concern使用您自己的方法扩展模型类。尝试将其放在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类定义为常规的独立类,然后重写它并使其成为模型。