2

私は現在、多くのフォームのフィールドと同じフォームの多くのフィールドに共通のパターンを持つ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 %>

他の2つのdivを囲むメインのdivタグがあります。token_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に入力が1つしかない場合にのみ機能します。これは、入力ブロックでyieldを使用すると、最後の1つだけが出力されるためです。

誰でも、toggle_content divで複数の入力を受け入れることができるように、これらをリファクタリングするためのより良いソリューションに関するヒントを与えることができますか?

編集:単にyieldではなくキャプチャヘルパーメソッドを使用して問題を解決しました。ヘルパーのコードは次のようになりました。

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 %>

ありがとう、モッシュ!

4

1 に答える 1

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を削除できますか?その場合の条項。

于 2011-05-23T23:01:37.093 に答える