Overring على القضبان طريقة mixin الأساسية، ولا تزال قادرة على استدعاء الأسلوب القديم
-
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
وفقط للتأكد من السفن المساعد مع التطبيق الخاص بك، وينبغي أن يكون هناك أي مشاكل. هل يمكن بالتناوب هذا إضافة إلى ليب من الجذر القضبان، ولكن أنا لست متأكدا بالضبط المكان الذي وضع يتطلب كود لتشغيله في الوقت المناسب.