4

我试图修改印象派宝石类“印象”无济于事。

我尝试了以下方法:

class Impression
  def hello
    "world"
  end
end

Impression.class_eval do
end

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

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

4

4 回答 4

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

您也可以尝试将代码放入初始化程序中,因为它也可能是加载顺序问题。

于 2013-10-21T08:41:46.147 回答
1

尝试这个:

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

class Impression
  def hello
    "world"
  end
end
于 2013-10-23T19:27:50.380 回答
1

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

于 2013-10-24T07:36:12.777 回答
1

使用您自己的方法扩展模型类应该使用关注点来完成。尝试将其放在文件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 类定义为一个常规的、独立的类,然后覆盖它并使其成为模型。

于 2014-03-19T19:44:25.490 回答