سؤال

ولدي نظام النموذجيه قديمة جدا مكتوبة على رأس ERB. وهي تعتمد على قوالب ERB تخزينها في قاعدة البيانات. وقراءة تلك والمقدمة. عندما أريد أن تمرير البيانات من قالب واحد إلى آخر وأنا استخدم: السكان المحليين المعلمة إلى القضبان تجعل الأسلوب. لتحديد المتغيرات الافتراضية لهذه المتغيرات في بعض القوالب يمكنني استخدام المعرفة؟ الطريقة التي يقول لي ببساطة إذا تم تعريف المتغير المحلي وإذا لم يكن I تهيئة مع القيمة الافتراضية مثل هذا:

unless defined?(perex)
  perex = true
end

وأنا تطوير التطبيق لأحدث القضبان وأنا أرى بعض سلوك غريب. هذا وتعمل أساسا في بعض الأحيان (وأحيانا PEREX غير معرف) وأحيانا لا (يتم تعريف PEREX وتعيين إلى لا شيء). يحدث هذا دون تغيير أي شيء آخر.

ولدي سؤالان: هل هناك أي طريقة أخرى أفضل من استخدام المعرفة؟ التي تثبت غير موثوق بها (كان يعتمد عليه لعدة سنوات على رأس القضبان 1،6)؟ يجب أن مثل هذه الطريقة لا تؤدي إلى إعادة صياغة لي كل القوالب. لقد كان يمر مستندات روبي ولم يكن قادرا على العثور على أي شيء حول تعريفها؟ طريقة، أسلوب. هل كان إهمال أو أنا فقط أعمى سهل؟

تحرير: كان سبب المشكلة الفعلية التي ما يبدو أن يكون خطأ روبي / إرب. أحيانا <م> إلا بيان ان يعمل، ولكن في بعض الأحيان لا. الشيء الغريب هو أنه حتى لو حصلت على تنفيذ السطر الثاني <م> PEREX بقي يزال خارج لا شيء لبقية العالم. إزالة محددة؟ حل ذلك.

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

المحلول

أولا: في الواقع، defined? هو المشغل <. / P>

ثانيا: إذا فهمت سؤالك بشكل صحيح، وطريقة للقيام بذلك هي مع هذا المصطلح روبي:

perex ||= true

وهذا سوف تعيين وفيا لperex لو كان غير معروف أو nil. انها ليست بالضبط ما يفعله بك على سبيل المثال، منذ لك لا تقييم مهمة عندما تكون القيمة nil، ولكن إذا كنت تعتمد على أن ذلك الحين، في رأيي، دون أن يراها، وكنت لا أكتب رمز واضح.

تحرير : كما لوحظ Honza، البيان أعلاه محل قيمة perex عندما حان false. ثم أقترح ما يلي لإعادة كتابة الحد الأدنى لعدد الخطوط:

perex ||= perex.nil?  # Assign true only when perex is undefined or nil

نصائح أخرى

والطريق الأسلم لاختبار إذا تم تعريف المحلية في قالب القضبان هي:

local_assigns[:perex]

وهذا هو موثقة في API القضبان جنبا إلى جنب مع التفسير الذي defined? لا يمكن استخدامها بسبب قيد التنفيذ.

ولكل إجابة mislav، وذهبت تبحث عن ذلك وثائق في API القضبان، وجدت في <لأ href = "http://api.rubyonrails.org/classes/ActionView/Base.html" يختلط = "noreferrer" > الدرجة ActionView :: قاعدة (وتحت عنوان "تمرير المتغيرات المحلية إلى القوالب الفرعية"). لقد كان بالكاد يستحق البحث، على الرغم من أنه قال بالكاد أي شيء أكثر مما فعل mislav. إلا أنه يوصي هذا النمط:

if local_assigns.has_key? :perex

ومع الأخذ بعين الجواب considerationg mislav الأصلية و <ل أ href = "https://stackoverflow.com/questions/238615/defined-method-in-ruby-and-rails/1924195#1924195"> KenB في وضع ، وأعتقد أن ما يلي هو أفضل نهج المطلق (على الرغم من أنا مستعد لسماع الرأي). فإنه يستخدم تجزئة # جلب طريقة لإجراء احتياطيا على قيمة بديلة في حالة عدم وجود المفتاح في تجزئة الأصلية.

perex = local_assigns.fetch(:perex, true)

وهذا هو أفضل حتى من طريقة ||= أن معظم المستخدمين سوف تشير في بعض الأحيان منذ كنت تريد أن تسمح القيم false. على سبيل المثال، التعليمة البرمجية التالية سوف <م> لا تسمح قيمة false لتمريرها في:

perex = local_assigns[:perex] || true
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top