我试图扩展一个主动记录模式(Vote
),即一个宝石(https://github.com/peteonrails/vote_fu )为我的应用程序提供。 (在 ap/models
中,没有 vote.rb
。
我的第一个方法是创建一个名为 lib/extend_vote.rb
的文件,其中包含代码:
Vote.class_eval do
after_create :create_activity_stream_event
has_one :activity_stream_event
def create_activity_stream_event
# something..
end
end
当第一次投票创建时, 这有效, 但是当我试图创建每次随后的投票时, 我就会得到错误 < code> TypeError (无法 dup NilClass) code > 。
我认为,这一错误是由于以下事实造成的:在每次请求后,Vote
类都会自动重新装入,但是在服务器启动时,只有一次才装入 lib/extend_vote.rb
中的代码,这导致has_one: 活动_ 流_ event
关联行为怪异。 (因此,如果我在 config.cache_ clases= true
中设置 ,问题就会消失。 rb
)
为了解决这个问题,我试图通过在我的 development.rb
中添加一个 to_preppare
块来根据每一项请求重新加载投票延期:
config.to_prepare do
load extend_vote.rb
end
这将解决 (t dup NilClass)
问题, 但是现在每当我创建新选票时, create_ actual_ stream_event
回调会被调出一个额外的时间。 第一票一次调用它,第二票调用它两次,等等。 因此似乎 to_ prepare
块正在重新装入扩展 TOO, 并添加重复的回调 。
为此 < code> Vote 模式添加方法和回调的最佳方式是什么?