0

私は:has_many :through関係のためのフォームを構築しています:

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

class Person < ActiveRecord::Base
  has_many :employments
  has_many :accounts, :through => :employments
end

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

Employmentモデルにはフィールドと:account_idが含まれています:person_id

アカウント フォーム内に、次を追加します。

<% fields_for 'account[employments_attributes][]', @account.employments do |e| %>
  <%= e.hidden_field :account_id, :value => @account.id %>
  <%= e.collection_select :person_id, Person.all, :id, :name %>
<% end %>

collection_select、またはselect同様に、私が与えた順列では、 NoMethodError 例外で失敗します:

undefined method `person_id' for #<Array:0x82e7db0>

person_idフィールドが存在しないかのように見えますが、create メソッド:account_id:person_id完全に呼び出すことができます。

4

1 に答える 1

2

私自身の質問に答えます。Rails のように考えるように脳を訓練していると、このような状況に出くわしたことがあります。

forms_forコントローラーから既にインスタンス化されたオブジェクトに作用する必要があります。これは雇用オブジェクトを作成するためのフォームではなく、空のフィールドに入力しています。editそのため、アクションで空の雇用オブジェクトを作成する必要がありました。

@account.employments.build

適切なロジックでカプセル化されているため、必要なときにのみ作成されます。

于 2009-09-29T05:32:37.063 に答える