Question

I have developed two plugins and they both modify the same method of the same class via alias_method_chain that result into stack level too deep error.

first plugin:

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

Second plugin modify the class same way but with different feature:

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

When I trying to call this method I got:

ActionView::Template::Error (stack level too deep):
  plugins/my_plugin/lib/issue_patch.rb:8

One possible but hack solution is simple monkey patch the redmine code with first plugin feature so the second plugin can alias it without any error.
So how I can fix this error?

Was it helpful?

Solution

The problem was:

I define two modules with the same name IssuePatch so the first module overwrites the second but

Issue.send                  :include, IssuePatch

still exists in 2 places (for each plugin) and the same module (doesn't matter which one overwrites the other) so the same module were included 2 times and the same alias_method_chain were called 2 times.

The solution: I just add separate module for each plugin and included them like this:

Issue.send                  :include, FirstPlugin::IssuePatch
Issue.send                  :include, SecondPlugin::IssuePatch
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top