Создайте блок области действия в помощнике рельсов для дополнительных методов области - PullRequest
4 голосов
/ 05 января 2011

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

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

<%= 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

1 Ответ

5 голосов
/ 05 января 2011

Судя по всему, 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.Надеюсь, это поможет!

...