これらの関係を考えると:
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 -%>