قم بإنشاء كتلة تم تحديد النطاق في Rails Helper لطرق توسيع إضافية
-
25-09-2019 - |
سؤال
أرغب في تحديد بعض أساليب المساعد داخل مساعد كتلة ولكن احتفظ بها في نطاق الكتلة حتى أتمكن من الحصول على أسماء طرق معقولة ويبدو أنظف.
قل أنني أريد أن أفعل ما يلي (مثال أساسي للغاية) ، في رأيي باستخدام المساعدين:
<%= foo_box do |b| %>
<%= b.title( 'Foo Bar' ) %>
Lorem Ipsum...
<% end %>
لإنتاج شيء مثل
<div class="foo_box">
<h2>Foo Bar</h2>
Lorem Ipsum...
</div>
بهذه الطريقة يمكن أن أحصل أيضًا على ملف bar_box
مساعد كتلة يمكن أن يكون أيضًا title
الطريقة التي تخرج شيئًا مختلفًا تمامًا.
حاليا قمت بتنفيذهم كطرق مختلفة ، على سبيل المثال foo_box
و foo_box_title
, ، مع foo_box
التعامل مع الكتلة مثل SO:
def foo_box(&block)
content_tag(:div, capture(&block), :class => 'foo_box')
end
المحلول
بمظهره ، capture
لا يسمح لك بتمرير أي وسيطات إلى الكتلة ، والتي تريد القيام بها. الحجة إلى الجهير في (b
) يجب أن يكون كائنًا من نوع ما تحدده title
الخ. الأساليب على. لذلك ، دعنا نحدد فئة المساعد التي ستخرج الأشياء التي تحتاجها ، وتمريرها إلى الكتلة التي تم تمريرها من العرض ، ثم التقاطها وتحيط بها في div
كما فعلت أعلاه. سأفعل شيئًا كهذا:
class FooBoxHelper
include ActionView::Helpers::TagHelper
def title(text)
content_tag(:h2, text)
end
def small(text)
content_tag(:p, text, :class => "small")
end
end
def foo_box(&block)
new_block = Proc.new do
helper = FooBoxHelper.new
block.call(helper)
end
content_tag(:div, capture(&new_block), :class => 'foo_box')
end
انظر كيف حصلت على الحد من capture
طريقة؟ من خلال ربط بروك جديد بالنطاق الحالي ، والتمرير في كائن المساعد هناك ، نحصل على كتلة يمكننا الاتصال بها بدون وسيطات ، وبالتالي مقبولة بواسطة capture
. أيضًا ، تأكد من أن فصل المساعد الخاص بك يتضمن جميع أساليب المساعد ذات الصلة من ActionView::Helpers
. أتمنى أن يساعدك هذا!