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

时间:2016-03-24 15:42:24

标签: ruby-on-rails ruby-on-rails-3 rubygems override method-overriding

version : Rails 3.2.22.2

我使用Impressionist gem来跟踪用户活动: https://github.com/charlotte-ruby/impressionist

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

我尝试了两件事:

1:在impression.rb

下创建app/models文件
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 个答案:

答案 0 :(得分:3)

我做了以下修改以使我的代码工作。在初始化程序下,我创建了一个文件 - > 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的所有帮助

答案 1 :(得分:2)

我更愿意选择2种方法。但是你已经在课堂上看到了你的方法。然后,为了覆盖它,您需要在model/impression_decorator.rb中使用。

Impression.class_eval do
  attr_accessor  :something

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