2009-09-29 8 views
0

Je construis un formulaire pour une relation :has_many :through:NoMethodError avec collection_select

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 

Le modèle Employment contient les champs :account_id et :person_id.

Dans le formulaire de compte, je suis d'ajouter:

<% 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, ou select ainsi, dans toute permutation je leur donne échouent avec une exception NoMethodError:

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

Il est comme si le champ person_id n'existe pas et pourtant je peux appeler la méthode create avec :account_id et :person_id parfaitement bien.

Répondre

2

Répondre à ma propre question. Alors que j'entraîne mon cerveau à penser à la façon Rails, j'ai été confronté à des situations comme celles-ci où je pense simplement au problème.

forms_for doit agir sur un objet déjà instancié à partir du contrôleur. Plutôt que ce soit un formulaire à créer l'objet d'emploi, il est de remplir les champs dans un vide. Donc, je devais créer un objet vide emploi dans l'action edit:

@account.employments.build 

encapsulées avec la logique appropriée de sorte qu'il ne se crée quand je besoin.

Questions connexes