Soru Raylarda bir gemiden bir modül yöntemini geçersiz kılmak


Will_paginate gem benim Oracle sürümünde bozuldu. Varsayılan paginate_by_sql WillPaginate modülündeki yöntem, bir soruna fazladan 'AS' ekleyerek başarısız olmasına neden olur.

Kodun kendisi kolayca çözülür, ancak Rails'in değişimimi almasının en iyi yolundan emin değilim.

Kodu diğer makinelerde bozulacağından, gemideki kodu değiştirmek istemiyorum.

İçeren bir lib / test.rb dosyası oluşturmayı denedim:

module WillPaginate
  def paginate_by_sql
    (my code goes here)
  end
end

ve environment.rb dosyasında bunu gerektiriyor, ancak değişikliklerimi almıyor. Ayrıca, denetleyiciden / application.rb'den bunu denemeyi denedim, ancak yine de değişikliklerimi toplamadım.

Geçici olarak, belirli modelin içindeki yöntemi geçersiz kılarak işe koyuldum, ama bu biraz bir kesmek ve bu projede diğer modellerin herhangi birinde kullanamayacağım anlamına geliyor.

Eminim bunu yapmanın kolay bir yolu var, ancak Google’ı kullanarak izleme şansım yok.


44
2018-02-24 03:04


Menşei


Gem kodu kırılmışsa, kesinlikle her yerde kırılmış mı? Projeyle ilgili bir hata kaydettin mi? wiki.github.com/mislav/will_paginate/report-bugs - Mike Woodhouse
Henüz değil - hata, Oracle'ın özel durumlarını ele alan bir blokta. Nedeni oracleenhanced (oracle veya oci) bağdaştırıcısı kullanıyorum çünkü. Sanırım çoğu ppl oracle bağdaştırıcısını kullanıyor ve bu işe yaramıyordu) Yine de hata günlüğünü kaydeder. - Dave Smylie


Cevaplar:


Yaptığınız şey işe yarayacak, ancak kodunuzun şöyle görünmesi gerekiyor:

module WillPaginate
  module Finder
    module ClassMethods
      def paginate_by_sql(sql, options)
        # your code here
      end
    end
  end
end

Başka bir deyişle, finder.rb'ye gidin, modül üstbilgileri ve geçersiz kılmak istediğiniz yöntem hariç her şeyi silin, daha sonra lib dosyasındaki bir dosyaya kaydedin ve environment.rb'ye ekleyin. Voila, hemen maymun yaması!


27
2018-02-24 04:44



Güzel. Teşekkürler. Bu hile yaptı =) - Dave Smylie
Bu başlatıcı içinde olmalıdır config/initializers - bunu koymayın environment.rb dosya! - Tilo


Daha kısa bir çözüm:

WillPaginate::Finder::ClassMethods.module_eval do
 def paginate_by_sql sql, options
   # Your code here
 end
end

Kodu, yapılandırma / başlatıcılarda bir başlatıcı dosyasına koyun. Ortam yüklendiğinde çalıştırılması gereken kodları koymak için doğru yer burasıdır. Aynı zamanda kodunuzu daha iyi organize eder, her dosyanın amacını daha net hale getirir, böylece hataları izlemek daha kolay olacaktır. Environment.rb dağınıklık etmeyin!


63
2017-12-05 15:14



Temel sınıf yüklenirse ilginç köşe durumu autoload : stackoverflow.com/questions/8736451/... - Tilo
Oldukça havalı. Yeni paginate_by_sql, eski sürümüne erişebilir miyim? Gibi bir şey söyleyebilir miyim super(sql, options)? - Augustin Riedinger


Tamam, sadece kendim gibi gelen ve diğer cevapları okuduktan sonra biraz mücadele eden insanlar için bunu daha kolay hale getireceğim. 

İlk kod satırını arayarak github repo üzerinde değiştirmek istediğiniz kodu bulun (bunu kullanarak kolayca bulabilirsiniz) gözetlemek) gemde değiştirmek ve sonra seçmek Code yerine solda Issues

enter image description here

enter image description here

Sonraki Değiştirmek istediğiniz modülün içeriğini kopyalayın ve uygun şekilde adlandırın. .rb config / initializers klasörünüzün içinde dosya. İşte bir örnek:

module Forem
  module TopicsHelper
    def link_to_latest_post(post)
      text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
      link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
    end
  end
end

Şimdi, şununla değiştirin:

Forem::TopicsHelper.module_eval do
  def link_to_latest_post(post)
    text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
    link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
  end
end

Şimdi, kodda ek değişiklikler yapın ve sunucunuzu yeniden başlatın.

Sen git!


40
2018-01-30 01:10



Bunun gibi orijinal yöntemi arayabilir misiniz yoksa bunun için alias_method_chain (Rails'de) var mı? - Machisuji
Orijinal yöntem - Abram
Teşekkürler @Abram! Bu çok yardımcı oldu! - KavitaC