Rails 3:如何在不更改 Gem 源的情况下向 Gem 模型添加方法

Rails 3: How to add a method to the Gem model without changing the Gem source

version : Rails 3.2.22.2

我正在使用印象派 gem 来跟踪用户 activity: https://github.com/charlotte-ruby/impressionist

这给了我 ActiveModel::MassAssignmentSecurity::Error。 我想覆盖 gem 中的 Impression 模块以使用 attr_accessible.

我尝试了两件事:

1:在app/models

下创建一个impression.rb文件
class Impression
  def hello
    "hello world"
  end
end

initializer/impression.rb,

require 'impression'

当我在控制台上尝试以下操作时:

a = Impression.first
a.hello

我遇到找不到方法的错误。

2:我在initializezs/impression.rb文件中添加了代码:

Impression.class_eval do
    def hi
        puts 'you got me!'
    end
end

我仍然遇到与第 1 点相同的错误。

如何有效地覆盖 gem 中的模型?

我更愿意使用 2 方法。但是你已经看到你的方法是否已经在 class 中。然后要覆盖它,您需要在 model/impression_decorator.rb.

中使用
Impression.class_eval do
  attr_accessor  :something

  def hi
    puts 'you got me! #{someting}'
  end
end

我做了以下修改以使我的代码工作。在初始值设定项下,我创建了一个文件 -> initializer/my_monkey_patch.rb,代码如下

class Impression < ActiveRecord::Base
        attr_accessible :impressionable_type, :impressionable_id, :controller_name, :action_name, :user_id, :request_hash, :session_hash, :ip_address, :referrer

        def hello
            "hello WORLD!"
        end
end

感谢@Mohammad Shahadat Hossain 的帮助