1

これらの関係を考えると:

class Account < ActiveRecord::Base
  has_many :employments
  has_many :people, :through => :employments
  accepts_nested_attributes_for :employments
end

class Employment < ActiveRecord::Base
  belongs_to :account
  belongs_To :person
end

アカウントの雇用記録を一覧表示しようとしています:

<% form_for @account do |f| -%>
  <% f.fields_for :employments do |e| -%>
    <%= render :partial => 'employment', :collection => @account.employments, :locals => { :f => e } %>
  <% end -%>
<% end -%>  

@account の Employment テーブルに 2 つのレコードが含まれていることを確認しましたが、employments を 2 回繰り返すため、パーシャルの 4 つのコピーを取得します。

Employment Load (1.0ms)   SELECT * FROM [employments] WHERE ([employments].account_id = 1) 
Person Load (1.3ms)   SELECT * FROM [people] WHERE ([people].[id] = 2) 
Rendered accounts/_employment (17.9ms)
Person Load (1.5ms)   SELECT * FROM [people] WHERE ([people].[id] = 1) 
Rendered accounts/_employment (5.1ms)
Rendered accounts/_employment (2.2ms)
Rendered accounts/_employment (2.1ms)

なぜそれが起こるのか誰か説明できますか?


追加情報は次のとおりです。

_employment.html.erbパーシャル:

<div class="employment">
  <span class="name"><%= link_to h(employment.person.name), person_path(employment.person) %></span>
  <span class="role"><%=h employment.role %></span>
  <span class="commands"><%= remove_child_link "Remove", f %></span>
</div>

remove_child_linkフォームフィールドを生成する必要がある唯一の場所です。レコードのフィールドを作成し_delete、値を「1」に変更する削除リンクを接続します。ただし、「ロール」プロパティも編集可能です。重要なことは、すべてのフィールドを編集可能にしたくないということです。

このビューのaccounts_controllerアクション:

def edit
  @account = Account.find(params[:id])
end

def update
  @account = Account.find(params[:id])

  respond_to do |format|
    if @account.update_attributes(params[:account])
      flash[:notice] = "#{@account.business_name} was successfully updated."
      format.html { redirect_to @account }
    else
      format.html { render :action => "edit" }
    end
  end
end

ベンは私を正しい方向に導いてくれました。いくつかの実行時検査により、レコードが変数に格納されていることがわかりobjectます (これは既に知っていましたが、コンテキストが異なります)。fields_forしたがって、この節を次のように書き直すことができます。

<% form_for @account do |f| -%>
  <% f.fields_for :employments do |e| -%>
    <div class="employment">
      <span class="name"><%= link_to h(e.object.person.name), person_path(e.object.person) %></span>
      <span class="role"><%=h e.object.role %></span>
      <span class="commands"><%= remove_child_link "Remove", e %></span>
    </div>
  <% end -%>
<% end -%>
4

2 に答える 2

3

雇用モデルのフィールドごとにその部分的なレンダリングを行います - 実際には、雇用レコードごとに 1 回実行する必要があります。つまり、fields_for の繰り返しを削除します。

<% form_for @account do |f| -%>
   <%= render :partial => 'employment', :collection => @account.employments %>
<% end -%>
于 2009-11-20T01:00:12.537 に答える