2011-01-05 3 views
3

Я хотел бы определить некоторые вспомогательные методы в блочном помощнике, но держать их в рамках блока, чтобы у меня были разумные имена методов, и он выглядит более чистым.Создайте облачный блок в помощнике rails для дополнительных методов с областью

Скажите, что я хочу сделать следующее (очень простой пример), на мой взгляд, с помощью хелперов:

<%= 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 обработки блока следующим образом:

def foo_box(&block) 
    content_tag(:div, capture(&block), :class => 'foo_box') 
end 

ответ

4

Судя по всему, 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? Связывая новый Proc с текущей областью и передавая туда вспомогательный объект, мы получаем блок, который мы можем вызвать без аргументов, и, таким образом, приемлемым для capture. Кроме того, убедитесь, что ваш вспомогательный класс включает все соответствующие вспомогательные методы от ActionView::Helpers. Надеюсь это поможет!

+0

Это прекрасно, спасибо – DEfusion

 Смежные вопросы

  • Нет связанных вопросов^_^