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 的帮助
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 的帮助