0

私の Rails アプリには、fields_for何度も使用するフォームがあり、場合によっては への呼び出しをネストしていfields_forます。

残念ながら、グラフィック デザイナーは、入力フィールドが関連するモデルに従ってグループ化されないように、入力フィールドを並べ替えるように主張しています。したがって、ブロックを簡単に作成できるヘルパーを作成したいとfields_for思いますが、ヘルパー メソッドで可変数のブロックをネストする方法がわかりません。

説明のために、次のようなコードを想像します。

<%= form_for @object do |f| %>
  <!-- The helper method should have a similar effect to the following... -->
  <%= f.fields_for :assoc_a do |assoc_a_builder| %>
    <%= assoc_a_builder.fields_for :assoc_b do |assoc_b_builder| %>
      <%= assoc_b_builder.text_field :field_name %>
    <% end %>
  <% end %>      
  <!-- ...when given the following data... -->
  <%= my_helper [f, :assoc_a, :assoc_b], :text_field, :field_name %>

<% end %>

どうすればこれを達成できますか?

4

2 に答える 2

1

私は次のヘルパー メソッドを実装しました (おそらく最良のものではありません)。

ビューでの関数呼び出しの例:

<%= form_for @object do |builder| %>
  <%= nested_form_field 'My label text', [builder, :association_name, :field_name], :collection_select, :my_model_id, MyModel.all, :id, :name %>
<% end %>

関数定義:

  # Outputs a label and input, nesting calls to fields_for if 'form' arg is an Array.
  # e.g. <%= nested_form_field nil, [builder, :approved_details], :collection_select, :my_model_id, MyModel.all, :id, :name %>
  # Make label_text nil for just the input tag, no wrapping elements.
  def nested_form_field label_text, form, helper_method, field, *args_for_helper_method
    if form.is_a? Array
      if form.length > 1
        form.shift.fields_for form.first do |builder|
          form[0] = builder
          nested_form_field label_text, form, helper_method, field, *args_for_helper_method
        end
      else
        nested_form_field label_text, form.first, helper_method, field, *args_for_helper_method
      end
    else
      if label_text.nil?
        form.send helper_method, field, *args_for_helper_method
      else
        %Q(<div class=row>
        <div class=span4>#{label_text}</div>
        #{ form.send helper_method, field, *args_for_helper_method }
        </div>).html_safe
      end
    end
  end
于 2013-06-24T18:25:01.140 に答える
0
<%= simple_form_for(@primer3) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <% @primer3.attributes.each_pair do |name, value| %>
      <%= f.input name if value %>
    <% end %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>
于 2013-06-25T10:42:46.080 に答える