我正在为: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
字段不存在,但我可以使用:account_id
和:person_id
完全正确地调用create方法。
答案 0 :(得分:2)
回答我自己的问题。当我训练我的大脑思考Rails的方式时,我一直在遇到这样的情况,我只是在考虑这个问题。
forms_for
需要对来自控制器的已实例化对象进行操作。而不是这是创建就业对象的形式,而是填写空的字段。所以,我需要在edit
动作中创建一个空的就业对象:
@account.employments.build
使用适当的逻辑封装,因此只有在需要时才会创建它。