قم بإنشاء كتلة تم تحديد النطاق في Rails Helper لطرق توسيع إضافية

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

سؤال

أرغب في تحديد بعض أساليب المساعد داخل مساعد كتلة ولكن احتفظ بها في نطاق الكتلة حتى أتمكن من الحصول على أسماء طرق معقولة ويبدو أنظف.

قل أنني أريد أن أفعل ما يلي (مثال أساسي للغاية) ، في رأيي باستخدام المساعدين:

<%= 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. أتمنى أن يساعدك هذا!

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