Cara mengupgrade plugin redmine ke rails 5, alias_method_chain sudah tidak digunakan lagi sekarang

Mode cerita

Baru saja mulai mempelajari RoR, namun dalam waktu singkat saya perlu menambahkan fungsionalitas yang mirip dengan Memuat gambar dari LDAP (versi tidak kompatibel) ke dalam proyek kami. Proyek terbengkalai, dan saya tidak dapat menemukan info/dokumen terkait, jadi saya meminta bantuan di sini. Solusi, tutorial, apa pun bisa berhasil.

Catatan eror

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

Patch monyet yang perlu diperbarui

plugin\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

Upaya saya / Artikel

Saya menemukan artikel bagus di sini Cara Mengganti alias_method_chain, tapi saya tidak begitu yakin bagaimana cara menerapkan gaya prepend ke patch monyet plugin Redmine. Tidak bisa membuatnya berfungsi :/


person Norman Edance    schedule 26.04.2019    source sumber
comment
Temukan artikel lain Module.prepend: cerita super yang mungkin membantu seseorang.   -  person Norman Edance    schedule 26.04.2019


Jawaban (3)


Apakah ini terkait dengan plugin ini?

Jika ya, inilah cara saya melakukannya:

  • Di file init.rb, ubah ini:
RedmineApp::Application.config.after_initialize do
  ApplicationHelper.send(:include, GemAvatarPlugin::ApplicationAvatarPatch)
end

Untuk ini:

RedmineApp::Application.config.after_initialize do
  ApplicationHelper.prepend(GemAvatarPlugin::ApplicationAvatarPatch)
end
  • Di lib/application_helper_gemavatar_patch.rb, ubah ini:
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

untuk ini:

module GemAvatarPlugin
  module ApplicationAvatarPatch

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

  end
end

Saya akan menghapus require 'application_helper' karena saya tidak mengerti mengapa itu diperlukan

person ste26054    schedule 02.05.2019
comment
Untuk beberapa alasan itu tidak berfungsi. Hanya memuat gambar gravatar_default. Sepertinya tidak pernah masuk ke model Gambar dan meminta gambar sebagai /people/avatar?id=1005 padahal seharusnya seperti /gemavatar/1005 - person Norman Edance; 03.05.2019
comment
Hmm itu aneh, ini berfungsi dengan baik untuk saya... Apakah Anda sudah menginstal plugin lain, seperti redmine_people? - person ste26054; 03.05.2019
comment
Juga, apa yang Anda dapatkan jika Anda meluncurkan rails c dari direktori redmine dan menjalankan ApplicationHelper.included_modules? - person ste26054; 03.05.2019
comment
Ya, aku memanfaatkan orang. Inilah yang disertakan_modul: [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
Oke, saya telah menonaktifkan redmine_people dengan menambahkan .. pada nama foldernya :D. Itu masih belum berhasil. - person Norman Edance; 03.05.2019
comment
Berkat tambahannya, patch GemAvatarPlugin dimuat terlebih dahulu sehingga seharusnya berfungsi dengan baik. Saat Anda membuka /my/account, apakah Anda mendapatkan sesuatu seperti ini di log Rails: Started GET "/gemavatar/:user_id"? - person ste26054; 03.05.2019
comment
Nah, semakin "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
Mungkin relevan: di log 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
Di pengaturan/tampilan Redmine, apakah Anda mengaktifkan Use Gravatar user icons? (Sepertinya diperlukan oleh plugin) - person ste26054; 03.05.2019
comment
Ya saya lakukan. Dan itu hanya menampilkan gambar gravatar default (perilaku yang sama seperti tanpa plugin) - person Norman Edance; 03.05.2019

Saya juga mencoba memperbarui plugin ini. Saya menggunakan https://github.com/alexandermeindl/redmine_local_avatars sebagai contoh.

Di init.rb ubah ini:

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

untuk ini:

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

lib/application_helper_gemavatar_patch.rb yang ditambal, terlihat seperti ini:

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

Saya mencobanya hanya dengan Redmine 4.0.3 tetapi sepertinya berhasil. Namun ada peringatan di log server web:

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

Pada plugin redmine_local_avatars terdapat patch yang berbeda untuk Redmine 4.1.

Pembaruan: Saya menyiapkan repositori github dengan perubahan: https://github.com/pentekl/redmine_gemavatar

person nemBela    schedule 06.03.2020

Anda dapat menggunakan alias_method alih-alih alias_method_chain, tetapi saya sedang mencari solusi seperti prepend

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

UPD: Namun ini memberikan peringatan:

/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: Seperti ste26054 disebutkan dalam jawabannya dan berkomentar di sini require 'application_helper' dapat dihapus untuk mencegah peringatan, karena sudah termasuk dalam inti.

person Norman Edance    schedule 26.04.2019
comment
Anda tidak bisa require 'application_helper'. Ini diperlukan saat runtime dan Anda dapat menemukannya di folder aplikasi /app Rails Anda. Anda mungkin mencoba meminta file yang salah. Anda dapat menampilkan jalur pemuatan otomatis dengan menjalankan echo $LOAD_PATH di terminal Anda dan mendapatkan info lebih lanjut tentang rel metode require dari Kernel modul di sini. Silakan bagikan repository proyek Anda di github dan url untuk plugins\redmine_gemavatar\lib\application_helper_gemavatar_patch.rb sehingga saya dapat memposting solusi saya untuk masalah ini. - person Fabrizio Bertoglio; 30.04.2019