2011-05-23 24 views
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!

回答

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

+0

捕获帮助器方法正是我所期待的,它解决了我的问题,谢谢!我只是需要做一些改变才能正常工作,并且block_given?不再需要。 – luizcosta 2011-05-24 03:02:59

相关问题