Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 2别名\u方法\u链->;堆栈级别太深_Ruby On Rails_Ruby_Recursion_Redmine_Alias Method - Fatal编程技术网

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问题已更新。