Как обновить плагин redmine до rails 5, alias_method_chain устарела - PullRequest
1 голос
/ 26 апреля 2019

Режим истории

Только начал изучать RoR, но в скором времени мне нужно добавить функциональность, аналогичную Загрузка изображений из LDAP (несовместимая версия) в наш проект. Проект закрыт, и я не могу найти какую-либо связанную информацию / документы, поэтому я прошу помощи здесь. Решение, учебник, все может работать.

Журнал ошибок

$ ruby bin/rake redmine:plugins RAILS_ENV="production"
rake aborted!
NoMethodError: undefined method `alias_method_chain' for ApplicationHelper:Module
Did you mean?  alias_method
...

Патч Monkey, который нуждается в обновлении

плагины \ redmine_gemavatar \ lib \ application_helper_gemavatar_patch.rb :

require 'application_helper'

module GemAvatarPlugin
    module ApplicationAvatarPatch
        def self.included(base)
            base.send(:include, InstanceMethods)
            base.class_eval do
                alias_method_chain :avatar, :gemavatar
            end
        end
        module InstanceMethods
            def avatar_with_gemavatar(user, options = { })
                if Setting.gravatar_enabled? && user.is_a?(User)
                    options.merge!({:ssl => (defined?(request) && request.ssl?), :default => Setting.gravatar_default})
                    options[:size] = "64" unless options[:size]
                    avatar_url = url_for :controller => :pictures, :action => :delete, :user_id => user
                    return "<img class=\"gravatar\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{avatar_url}\" />".html_safe
                else
                    ''
                end
            end
        end
    end
end

Мои попытки / Статьи

Я нашел хорошую статью здесь Как заменить alias_method_chain , но я не совсем уверен, как применить стиль prepend к патчу обезьяны redmine плагина. Просто не могу заставить его работать: /

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Это связано с этим плагином ?

Если так, вот как я бы это сделал:

  • В файле init.rb изменитеэто:
RedmineApp::Application.config.after_initialize do
  ApplicationHelper.send(:include, GemAvatarPlugin::ApplicationAvatarPatch)
end

На это:

RedmineApp::Application.config.after_initialize do
  ApplicationHelper.prepend(GemAvatarPlugin::ApplicationAvatarPatch)
end
  • В lib/application_helper_gemavatar_patch.rb, измените это:
require 'application_helper'

module GemAvatarPlugin
  module ApplicationAvatarPatch

    def self.included(base)
      base.send(:include, InstanceMethods)
      base.class_eval do
        alias_method_chain :avatar, :gemavatar
      end
    end

    module InstanceMethods

      def avatar_with_gemavatar(user, options = { })
        # method content omitted for clarity
      end

    end
  end
end

наэто:

module GemAvatarPlugin
  module ApplicationAvatarPatch

    def avatar(user, options = { })
      # method content omitted for clarity
    end

  end
end

Я бы удалил require 'application_helper', потому что не понимаю, зачем это нужно

0 голосов
/ 26 апреля 2019

Вы можете использовать alias_method вместо alias_method_chain, но я ищу что-то вроде prepend решение

                alias_method :avatar_without_gemavatar, :avatar
                alias_method :avatar, :avatar_with_gemavatar

UPD: Но выдает предупреждения:

/app/helpers/application_helper.rb:180: warning: already initialized constant ApplicationHelper
::RECORD_LINK
/app/helpers/application_helper.rb:180: warning: previous definition of RECORD_LINK was here
/app/helpers/application_helper.rb:199: warning: already initialized constant ApplicationHelper
::ATTACHMENT_CONTAINER_LINK
/app/helpers/application_helper.rb:199: warning: previous definition of ATTACHMENT_CONTAINER_LI
NK was here
/app/helpers/application_helper.rb:1053: warning: already initialized constant ApplicationHelpe
r::LINKS_RE
/app/helpers/application_helper.rb:1053: warning: previous definition of LINKS_RE was here
Exiting

UPD: Как ste26054 упомянул в своем ответе и прокомментировал здесь require 'application_helper' можно удалить для предотвращения предупреждений, поскольку он уже включен в ядро.

...