私は現在、多くのフォームのフィールドと同じフォームの多くのフィールドに共通のパターンを持つRailsアプリに取り組んでいます。これはパターンです:
<%= simple_form_for(@evaluation) do |f| %>
<%= f.error_notification %>
<div class="toggle">
<div class="toggle_selector">
<%= f.input :was_answered, :as => :radio, :collection => [:yes, :no, '?'] %>
</div>
<div class="toggle_content">
<%= f.input :name %>
<%= f.input :answer %>
<%= f.input :score %>
</div>
</div>
<div class="actions">
<%= f.button :submit %>
</div>
<% end %>
他の2つのdivを囲むメインのdivタグがあります。token_content divは、toggle_selector divにある入力からの値に基づいて、javascriptを使用して表示または非表示になります。
入力をパラメータとして受け取り、目的の出力を出力するヘルパーをいくつか抽出しようとしました。
def toggling_field_for form, selector, &block
content_tag :div, :class => 'toggle' do
%{#{toggle_selector form, selector}
#{toggle_content &block if block_given?}
}.html_safe
end
end
private
def toggle_selector form, selector
content_tag :div, :class => 'toggle_selector' do
form.input selector, :as => :radio, :collection => [:yes, :no, '?']
end
end
def toggle_content
content_tag :div, :class => 'toggle_content' do
yield if block_given?
end
end
ただし、これは、toggle_content divに入力が1つしかない場合にのみ機能します。これは、入力ブロックでyieldを使用すると、最後の1つだけが出力されるためです。
誰でも、toggle_content divで複数の入力を受け入れることができるように、これらをリファクタリングするためのより良いソリューションに関するヒントを与えることができますか?
編集:単にyieldではなくキャプチャヘルパーメソッドを使用して問題を解決しました。ヘルパーのコードは次のようになりました。
def toggling_field_for form, selector, &block
content_tag :div, :class => 'toggle' do
%{#{toggle_selector form, selector}
#{toggle_content &block}
}.html_safe
end
end
private
def toggle_content &block
content_tag :div, capture(&block), :class => 'toggle_content'
end
そして、各フォームでこのように呼ばれます:
<%= toggling_field_for f, :was_answered, do %>
<%= f.input :name %>
<%= f.input :answer %>
<%= f.input :score %>
<% end %>
ありがとう、モッシュ!