如何从带有div标签的表单中环绕多个输入?

时间:2011-05-23 21:41:05

标签: ruby-on-rails ruby-on-rails-3 helpers simple-form

我目前正在开发一个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!

1 个答案:

答案 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吗?在这种情况下的条款。