Ruby on rails 2别名\u方法\u链->;堆栈级别太深
我开发了两个插件,它们都通过Ruby on rails 2别名\u方法\u链->;堆栈级别太深,ruby-on-rails,ruby,recursion,redmine,alias-method,Ruby On Rails,Ruby,Recursion,Redmine,Alias Method,我开发了两个插件,它们都通过alias\u method\u chain修改了同一类的相同方法,导致堆栈级别太深错误 第一个插件: Rails.configuration.to_prepare do require 'issue_patch' Issue.send :include, IssuePatch end module IssuePatch module InstanceMethods def editable_custom_field_values_with_so
alias\u method\u chain
修改了同一类的相同方法,导致堆栈级别太深错误
第一个插件:
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代码进行猴子补丁,这样第二个插件就可以在没有任何错误的情况下对其进行别名。
那么如何修复此错误呢?问题是: 我定义了两个同名的模块,第一个模块覆盖第二个模块,但
Issue.send :include, IssuePatch
仍然存在于2个位置(每个插件)和同一个模块(不管哪个模块覆盖另一个),因此同一个模块被包含2次,同一个别名\u方法\u链被调用2次
解决方案:我只需为每个插件添加单独的模块,并将它们包括在内,如下所示:
Issue.send :include, FirstPlugin::IssuePatch
Issue.send :include, SecondPlugin::IssuePatch
不知道你在说什么很难说doing@FrederickCheung问题已更新。