我目前正在开发一个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 %>
主要的div标签围绕着另外两个div。根据toggle_selector div中输入的值,使用javascript使toggle_content div可见或不可见。
我尝试提取一些将输入作为参数并输出所需输出的助手:
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上只有一个输入时,这才有效,因为当我在输入块上使用yield时,只会输出最后一个。
任何人都可以提供更好的解决方案来重构这些,以便能够接受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!
答案 0 :(得分:1)
使用Rails 3,您的代码应该稍作修改:尝试更改
def toggle_content
content_tag :div, :class => 'toggle_content' do
yield if block_given?
end
end
到
def toggle_content(&block)
content_tag :div, :class => 'toggle_content' do
capture(&block) if block_given?
end
end
我不确定,但您可以删除block_given吗?在这种情况下的条款。