2

私はモデルを持っています:

class Contact < ActiveRecord::Base
  has_many :phones
  accepts_nested_attributes_for :phones
end

ユーザーが追加できる50台の電話番号を作成したい(すでに電話1または5が存在する可能性がありますが、常に50台が利用可能である必要があります)コントローラーで:

while contact.phones.length < 50
  contact.phones.build({:phone_type_id => PhoneType['a_cool_type'].id})
end

私の見解では、2列の電話番号をそれぞれ25行にしたい

 <%= semantic_form_for contact do |form| %>
   <table width=50%>
   <%= form.inputs :for => :phones[0..25] do |phone_form| %>            
      <td align="center"><%= phone_form.input :number, :label => false %></td>
       ....
   <% end %>
   </table>             
   <table width=50%>
   <%= form.inputs :for => :phones[25..49] do |phone_form| %>           
      <td align="center"><%= phone_form.input :number, :label => false %></td>
       ....
   <% end %>
   </table>
<%end %>

明らかに行:

<%= form.inputs :for => :phones[25..49] do |phone_form| %>

動作しませんが、それは私の意図を伝えます(私は願っています)。formtasticが基になるオブジェクトの関連付けをどのように取得するかをより細かく制御したいと思います。

以下は機能しますが、派手なcssなしでは2つの列を簡単に作成することはできません。

<%= form.inputs :for => :phones do |phone_form| %>

助言がありますか?

- - - - - アップデート - -

私はこれを迂回して回避することができました。contact.phones.buildではなくPhone.new(:contact_id => contact.id)として電話番号の別のリストを作成し、それらをというリストに保存しました。 @new_phones

次に、私のフォームは次のようになります。

<%= semantic_form_for @contact, :url => ..., do |f| %>
   <% @new_phones[0...25].each_with_index do |phone, i| %>
      <%= f.fields_for :phones, phone, :child_index => i do |phone_form| %>             
         <%= render "phone_fields", {:phone_form => phone_form, :phone => phone} %>
      <%end%>
    <% end %>
   ....
   <% @new_phones[25...50].each_with_index do |phone, i| %>
        <%= f.fields_for :phones, phone, :child_index => i+25 do |phone_form| %>                
        <%= render "phone_fields", {:phone_form => phone_form, :phone => phone} %>
    <%end%>
  <% end %>  
<%end%>

これにより、ページの一部に25台の電話を表示し、別の部分に25台の電話を表示でき、フォームの送信時にnested_attributes_for:phonesが期待どおりに機能しました。

4

1 に答える 1

2

ネストされた属性を希望どおりに機能させるのにいつも問題がありましたが、これは問題の解決に役立つ可能性があります。

モデル:

class Contact < ActiveRecord::Base
  has_many :phones
  accepts_nested_attributes_for :phones
end

@contract.phones.buildコントローラー: 50回ループしていることを確認してください。これにより、50個の新しいインスタンスが作成されます。

class Contact < ApplicationController
  def new
    @contact = Contact.new
    25.times do
      @contact.phones.build
    end

  end
end

new.html.erbを表示:

...
<%= p.semantic_fields_for :phones do |ec| %>
  <%= ec.input :number %>
<% end %>
...

悲しいことに、明確なクリーンアベイルズがないまま、ループをインターセプトするためのいくつかの試みを試みました。

于 2011-01-18T21:38:21.123 に答える