Overring على القضبان طريقة mixin الأساسية، ولا تزال قادرة على استدعاء الأسلوب القديم

StackOverflow https://stackoverflow.com/questions/1620468

  •  06-07-2019
  •  | 
  •  

سؤال

ولقب طيب مربكة، سوء اقول لكم مشكلتي أولا:

تم تغيير طريقة polymorphic_url في القضبان 2.2.1 لتشمل بعض وظائف اضافية أحتاج. ومع ذلك، أريد أن التطبيق لا يزال يعمل في الإصدارات القديمة من القضبان، لذلك أردت أن التصحيح على سلوك 2.2.1 إذا كان إصدار أقدم القضبان قيد التشغيل.

وalias_method_chain إلى اليمين الإنقاذ؟ أنا غير قادر على الحصول على عمل.

def polymorphic_url_with_compat(*args)
  whatever...
  return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat

والآن أود في البداية حاول وضع هذا في المساعد - فشل alias_method_chain لpolymorphic_url يكون لا يعرف في ذلك الوقت. حتى انتقلت نفس رمز إلى وحدة تحكم، وأنه لا خطأ، ولكن يحصل تجاهله. ثم حاولت تصحيح ذلك في ApplicationController :: قاعدة مع البرنامج المساعد - لا يزال غير محددة polymorphic_url

ويعرف polymorphic_url في وحدة ActionController :: PolymorphicRoutes. أنا لا أعرف متى / حيث يتم مزجه في وحدة التحكم / عرض حقا.

وكيف يمكنني الانتهاء من هذه الطريقة في الطريق أريد أن؟

هل كانت مفيدة؟

المحلول

وقبل أن نشرع، هل أنت متأكد أن polymorphic_url كانت موجودة في الإصدار القضبان قبل 2.2.1؟

وأنت الكود هو الغالب الحق، وكنت نسيان لاستدعاء النسخة الأصلية من هذه الطريقة. التي تتم إعادة تسمية polymorphic_url_without_compat بعد المكالمة alias_method_chain.

class ActiveRecord::PolymorphicRoutes
  def polymorphic_url_with_compat(*args)
    whatever...
    return polymorphic_url_without_compat(*args)
  end
  alias_method_chain :polymorphic_url, :compat
end

ولقد ذكرت حاولت إضافته إلى البرنامج المساعد، لذلك ما يلي: قد لا يكون ضروريا إذا بت السابق ثابتة مشكلتك.

وأفضل طريقة لضمان انها حملت بعد جوهر القضبان، هو تحويله الى البرنامج المساعد.

$ script/generate plugin polymorphic_url_backport

هل إنشاء كعب المساعد. كل الاتجاهات من هذه النقطة هي ذات الصلة إلى الدليل المساعد بإنشائه.

في لinit.rb إضافة

if RAILS_GEM_VERSION < "2.2.1"
  require File.dirname(__FILE__) + '/lib/yournamespace'
  ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes) 
end

ثم لصق رمز أعلاه في ليب الخاص بك / yournamespace.rb

module YourNameSpace
  class ActiveRecord::PolymorphicRoutes
    def included(base)
      base.class_eval %~
        def polymorphic_url_with_compat(*args)
          whatever...
          return polymorphic_url_without_compat(*args)
        end
        alias_method_chain :polymorphic_url, :compat
      ~
    end
  end
end  

وفقط للتأكد من السفن المساعد مع التطبيق الخاص بك، وينبغي أن يكون هناك أي مشاكل. هل يمكن بالتناوب هذا إضافة إلى ليب من الجذر القضبان، ولكن أنا لست متأكدا بالضبط المكان الذي وضع يتطلب كود لتشغيله في الوقت المناسب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top