Как обновить плагин redmine до rails 5, alias_method_chain устарел

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

Только начал изучать 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
...

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

плагины\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. Просто не могу заставить это работать :/


person Norman Edance    schedule 26.04.2019    source источник
comment
Нашел еще одну статью Module.prepend: суперистория, которая может быть полезным для кого-л.   -  person Norman Edance    schedule 26.04.2019


Ответы (3)


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

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

  • В файле 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', потому что не понимаю, зачем он нужен

person ste26054    schedule 02.05.2019
comment
По некоторым причинам это не работает. Загружает только изображение gravatar_default. Похоже, он никогда не входит в модель изображения и запрашивает изображения как /people/avatar?id=1005, хотя это должно быть что-то вроде /gemavatar/1005 - person Norman Edance; 03.05.2019
comment
Хм, странно, у меня он работает нормально... У вас установлен другой плагин, например redmine_people? - person ste26054; 03.05.2019
comment
Кроме того, что вы получите, если запустите rails c из каталога redmine и запустите ApplicationHelper.included_modules? - person ste26054; 03.05.2019
comment
Да, я использую людей. Вот включённые_модули: [GemAvatarPlugin::ApplicationAvatarPatch, RedminePeople::Patches::ApplicationHelperPatch::InstanceMethods, RedminePeople::Patches::ApplicationHelperPatch, Redmine::Helpers::URL, Redmine::Hook::Helper, Redmine::Themes::Helper, Redmine::SudoMode::Helper, Redmine::Paginatio n::Helper, GravatarHelper::PublicMethods, Redmine::I18n, Redmine::WikiFormatting::Macros::Definitions] - person Norman Edance; 03.05.2019
comment
Хорошо, я отключил redmine_people, добавив .. к имени папки :D. Это все еще ничего не делает. - person Norman Edance; 03.05.2019
comment
Благодаря приставке, патч GemAvatarPlugin загружается первым, поэтому он должен работать правильно. Когда вы переходите к /my/account, вы получаете что-то вроде этого в журнале рельсов: Started GET "/gemavatar/:user_id"? - person ste26054; 03.05.2019
comment
Нет, становится "GET /people/avatar?id=1005&size=50x50 HTTP/1.1" 404 11160 http://localhost:3000/my/account -> /people/avatar?id=1005&size=50x50 - person Norman Edance; 03.05.2019
comment
Может быть актуально: в логах Missing template, responding with 404: Missing template people/avatar, application/avatar with {:locale=>[:ru, :en], :formats=>[:html], : variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :axlsx, :rsb]}. - person Norman Edance; 03.05.2019
comment
В настройках/дисплее Redmine вы включили Use Gravatar user icons? (Похоже, это требуется плагином) - person ste26054; 03.05.2019
comment
Да. И он показывает только изображения граватара по умолчанию (такое же поведение, как и без плагина). - person Norman Edance; 03.05.2019

Я также пытался обновить этот плагин. В качестве примера я использовал https://github.com/alexandermeindl/redmine_local_avatars.

В init.rb изменил это:

RedmineApp::Application.config.after_initialize do
  ApplicationHelper.send(:include, GemAvatarPlugin::ApplicationAvatarPatch)
end

к этому:

RedmineApp::Application.config.after_initialize do    
  ApplicationHelper.include ApplicationAvatarPatch
end

исправленная lib/application_helper_gemavatar_patch.rb выглядит так:

module ApplicationAvatarPatch    
def self.included(base)
    base.send(:include, InstanceMethods)

    base.class_eval do
        alias_method :avatar_without_gemavatar, :avatar
        alias_method :avatar, :avatar_with_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}\" alt=\"Gemavatar text\" />".html_safe
        else
            avatar_without_gemavatar(user, options)
        end
    end
end
end

Пробовал только с Redmine 4.0.3, но вроде работает. Однако в журнале веб-сервера есть предупреждения:

127.0.0.1 - - [06/Mar/2020:20:58:23 CET] "GET /gemavatar/164 HTTP/1.1" 200 3545
http://tredmine1:3000/users/164 -> /gemavatar/164
[2020-03-06 20:58:23] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

В плагине redmine_local_avatars был другой патч для Redmine 4.1.

Обновление: я создал репозиторий github с изменениями: https://github.com/pentekl/redmine_gemavatar

person nemBela    schedule 06.03.2020

Вы можете использовать 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' можно удалить для предотвращения предупреждений, так как он уже включен в ядро.

person Norman Edance    schedule 26.04.2019
comment
Вы не можете require 'application_helper'. Это требуется во время выполнения, и вы можете найти его в папке приложения /app rails. Вероятно, вы пытаетесь запросить не тот файл. Вы можете отобразить путь автозагрузки, запустив echo $LOAD_PATH в своем терминале, и получить дополнительную информацию о метод require модуля Kernel здесь. Пожалуйста, поделитесь repository вашего проекта на github и URL-адресом plugins\redmine_gemavatar\lib\application_helper_gemavatar_patch.rb, чтобы я мог опубликовать свое решение этой проблемы. - person Fabrizio Bertoglio; 30.04.2019