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