सवाल रेल में एक मणि से मॉड्यूल विधि ओवरराइड करना


ओरेकल के मेरे संस्करण पर will_paginate मणि टूट गया है। डिफ़ॉल्ट paginate_by_sql WillPaginate मॉड्यूल में विधि एक क्वेरी में एक अतिरिक्त 'AS' डालने और इसे विफल करने के कारण है।

कोड को आसानी से ठीक किया जाता है, लेकिन मुझे यकीन है कि रेल मेरे परिवर्तन को लेने के लिए सबसे अच्छा तरीका नहीं है।

मैं खुद को मणि में कोड नहीं बदलना चाहता, क्योंकि यह मेरे कोड को अन्य मशीनों पर तोड़ देगा।

मैंने एक lib / test.rb फ़ाइल बनाने का प्रयास किया जिसमें निम्न शामिल हैं:

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

और इसे पर्यावरण.आरबी से जरूरी है, लेकिन यह मेरे परिवर्तनों को उठा नहीं रहा है। मैंने इसे नियंत्रकों / application.rb से भी जरूरी करने की कोशिश की, लेकिन फिर से, मेरे परिवर्तनों को नहीं उठाया।

अस्थायी रूप से, मुझे इसे विशिष्ट मॉडल के भीतर विधि को ओवरराइड करके काम करने के लिए मिला, लेकिन यह एक हैक का थोड़ा सा है, और इसका मतलब है कि मैं इस परियोजना के किसी भी अन्य मॉडल पर इसका उपयोग नहीं कर सकता।

मुझे यकीन है कि ऐसा करने का एक आसान तरीका है, लेकिन मुझे Google का उपयोग करके इसे ट्रैक करने में कोई भाग्य नहीं है।


44
2018-02-24 03:04


मूल


अगर मणि कोड टूटा हुआ है, तो निश्चित रूप से यह हर जगह टूट गया है? क्या आपने परियोजना के साथ एक बग लॉग किया है? wiki.github.com/mislav/will_paginate/report-bugs - Mike Woodhouse
अभी तक नहीं - बग एक ब्लॉक हैंडलिंग ऑरैकल विशिष्ट मामलों में है। इसका कारण यह है कि मैं ऑरैकेंहेन्स्ड (ऑरैकल या ओसीआई के बजाय) एडाप्टर का उपयोग कर रहा हूं। मुझे लगता है कि अधिकांश पीपीएल ऑरैक एडाप्टर का उपयोग कर रहे हैं और इसमें नहीं चलेंगे) वैसे भी बग लॉगिंग करेंगे। - Dave Smylie


जवाब:


आप क्या कर रहे हैं काम करेंगे, लेकिन आपके कोड को इस तरह दिखने की जरूरत है:

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

दूसरे शब्दों में, finder.rb में जाएं, मॉड्यूल हेडर और जिस विधि को आप ओवरराइड करना चाहते हैं उसे छोड़कर सबकुछ हटाएं, फिर lib में फ़ाइल में सहेजें और पर्यावरण.आरबी में शामिल करें। वोला, तत्काल बंदर पैच!


27
2018-02-24 04:44



ठंडा। धन्यवाद। वह चाल है =) - Dave Smylie
यह प्रारंभकर्ता में होना चाहिए config/initializers - इसे में मत डालो environment.rb फाइल! - Tilo


एक संक्षिप्त संक्षिप्त समाधान:

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

कोड को कॉन्फ़िगर / प्रारंभकर्ताओं में प्रारंभिक फ़ाइल में रखें। कोड लोड करने के लिए यह सही जगह है जिसे पर्यावरण लोड होने पर चलाने की आवश्यकता होती है। यह आपके कोड का बेहतर आयोजन करता है, जिससे प्रत्येक फ़ाइल का इरादा स्पष्ट हो जाता है, इस प्रकार बग को ट्रैक करना आसान हो जाएगा। पर्यावरण को अव्यवस्थित मत करो। आरबी!


63
2017-12-05 15:14



अंतर्निहित कक्षा के माध्यम से लोड होने पर दिलचस्प कोने का मामला autoload : stackoverflow.com/questions/8736451/... - Tilo
बहुत अच्छा। नए में paginate_by_sql, क्या मैं अपने पूर्व संस्करण तक पहुंच सकता हूं? क्या मैं कुछ कह सकता हूं super(sql, options)? - Augustin Riedinger


ठीक है, मैं बस अपने जैसे लोगों के लिए यह आसान बनाने जा रहा हूं जो अन्य उत्तरों को पढ़ने के बाद साथ आते हैं और अभी भी थोड़ा संघर्ष करते हैं। 

प्रथम उस कोड को ढूंढें जिसे आप कोड की रेखा के लिए खोज कर जिथब रेपो पर बदलना चाहते हैं (आप आसानी से इसका उपयोग कर सकते हैं जिज्ञासा) आप मणि में बदलना चाहते हैं, और फिर चयन करना चाहते हैं Code के बजाए बाईं तरफ Issues

enter image description here

enter image description here

आगामी उस मॉड्यूल की सामग्री की प्रतिलिपि बनाएँ जिसे आप बदलना चाहते हैं और उसे उचित नाम में रखें .rb अपने कॉन्फ़िगर / प्रारंभकर्ता फ़ोल्डर के अंदर फ़ाइल करें। यहाँ एक उदाहरण है:

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

अब, इसे यहां बदलें:

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

अब, कोड में कोई अतिरिक्त बदलाव करें और अपने सर्वर को पुनरारंभ करें।

दूर तुम जाओ!


40
2018-01-30 01:10



क्या आप इस तरह की मूल विधि को कॉल करने में सक्षम होंगे या आपके पास इसके लिए alias_method_chain (रेल में वैसे भी) है? - Machisuji
मूल विधि - Abram
धन्यवाद @ अब्राहम! यह बहुत उपयोगी था! - KavitaC