Как обновить плагин 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 плагина обезьяны патч. Просто не могу заставить его работать: /
2 ответа
Это связано с этим плагином?
Если так, вот как я бы это сделал:
- в
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'
потому что я не понимаю, зачем это нужно
Я тоже пробовал обновить этот плагин. В качестве примера я использовал 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
Ты можешь использовать 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'
можно удалить, чтобы предотвратить предупреждения, так как он уже включен в ядро.