2
我目前正在開發一個rails應用程序,該應用程序在許多窗體和相同窗體的許多字段中都有一個常見模式。這是模式:如何從一個帶有div標籤的表單環繞多個輸入?
<%= 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 %>
有一個主div標籤圍繞其他兩個div。 toggle_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一個輸入,因爲當我使用輸入塊的產量,只輸出最後一個輸出。
任何人都可以提供一個更好的解決方案,以重構這些能夠接受toggle_content div上的多個輸入的提示?
編輯:問題解決使用捕獲幫助器方法,而不是隻是屈服。該代碼弄成這樣的幫手:
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 %>
謝謝,mosch!
捕獲幫助器方法正是我所期待的,它解決了我的問題,謝謝!我只是需要做一些改變才能正常工作,並且block_given?不再需要。 – luizcosta 2011-05-24 03:02:59