我开发了两个插件,它们都通过alias_method_chain
修改同一类的相同的方法,导致 堆栈级别太深 < / strong>错误。
第一个插件:
Rails.configuration.to_prepare do
require 'issue_patch'
Issue.send :include, IssuePatch
end
module IssuePatch
module InstanceMethods
def editable_custom_field_values_with_sort(user=nil)
editable_custom_field_values_without_sort(user).sort
end
end
def self.included(receiver)
receiver.send :include, InstanceMethods
receiver.class_eval do
alias_method_chain :editable_custom_field_values, :sort
end
end
end
第二个插件以相同的方式修改类,但具有不同的功能:
Rails.configuration.to_prepare do
require 'issue_patch'
Issue.send :include, IssuePatch
end
module IssuePatch
module InstanceMethods
def editable_custom_field_values_with_some_stuff(user=nil)
editable_custom_field_values_without_some_stuff(user).select { |c| c.have_stuff? }
end
end
def self.included(receiver)
receiver.send :include, InstanceMethods
receiver.class_eval do
alias_method_chain :editable_custom_field_values, :some_stuff
end
end
end
当我尝试调用此方法时,我得到了:
ActionView::Template::Error (stack level too deep):
plugins/my_plugin/lib/issue_patch.rb:8
一个可能但是黑客的解决方案是简单的猴子补丁redmine代码与第一个插件功能,所以第二个插件可以别名,没有任何错误。
那我怎么能解决这个错误?
答案 0 :(得分:0)
问题是:
我定义了两个名称相同的模块IssuePatch
,所以第一个模块会覆盖第二个模块但是
Issue.send :include, IssuePatch
仍然存在于2个地方(对于每个插件)和相同的模块(无论哪一个覆盖另一个),因此相同的模块被包括2次,并且相同的alias_method_chain被调用2次。
解决方案:我只为每个插件添加单独的模块,并将其包含在内:
Issue.send :include, FirstPlugin::IssuePatch
Issue.send :include, SecondPlugin::IssuePatch