Question

Je ne peux pas sembler obtenir une forme imbriquée pour générer dans un rails pour voir une relation de belongs_to en utilisant la nouvelle installation de accepts_nested_attributes_for de Rails 2.3. J'ai vérifié un grand nombre des ressources disponibles et il ressemble à mon code devrait travailler, mais explose fields_for sur moi, et je pense qu'il a quelque chose à voir avec la façon dont je les modèles imbriqués configurés.

L'erreur que je frappe est une commune qui peut avoir de nombreuses causes:

'@account[owner]' is not allowed as an instance variable name

Voici les deux modèles concernés:

class Account < ActiveRecord::Base
  # Relationships
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
  accepts_nested_attributes_for :owner
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :account
end

Peut-être est là que je fais ce rong », comme un compte peut avoir un « propriétaire » et peut « utilisateurs », mais un utilisateur n'a qu'un seul « compte », basé sur le modèle de l'utilisateur touche account_id.

Ceci est le code de la vue en new.html.haml qui souffle sur moi:

- form_for :account, :url => account_path do |account|
  = account.text_field :name
  - account.fields_for :owner do |owner|
    = owner.text_field :name

Et voici le code du contrôleur pour la nouvelle action:

class AccountsController < ApplicationController
  # GET /account/new
  def new
    @account  = Account.new
  end
end

Lorsque je tente de charger / compte / nouvelle que je reçois l'exception suivante:

NameError in Accounts#new
Showing app/views/accounts/new.html.haml where line #63 raised:
@account[owner] is not allowed as an instance variable name

Si je tente d'utiliser la mystérieuse méthode « construction », il seulement des bombes dans le contrôleur, peut-être parce que la construction est juste pour les relations multi-enregistrement:

class AccountsController < ApplicationController
  # GET /account/new
  def new
    @account  = Account.new
    @account.owner.build
  end
end

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.build

Si je tente de faire cela avec @ account.owner_attributes = {} dans le contrôleur, ou @ account.owner = User.new, je suis de retour à l'erreur d'origine, « [le propriétaire] @account n'est pas autorisé comme une instance nom de la variable ».

Quelqu'un d'autre a la nouvelle méthode accepts_nested_attributes_for travailler avec une relation de belongs_to? Y at-il quelque chose de spécial ou différent, vous devez faire? Tous les exemples officiels et des exemples de code (comme le grandes choses sur au Ryans ) Scraps concerne les associations multi-enregistrement.

Était-ce utile?

La solution

Je pense que votre accepts_nested_attributes est du mauvais côté de la relation. Peut-être quelque chose comme ça fonctionnerait?

class Account < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id'
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :account
  has_one :account, :foreign_key => :owner_id
  accepts_nested_attributes_for :account
end

Pour la construction du compte que vous souhaitez utiliser build_account.

Vous pouvez voir plus d'exemples dans les docs .

Autres conseils

Je suis quelques mois trop tard, mais je cherchais à résoudre cette erreur et ma situation était que je ne pouvais pas changer la relation à « faire face à l'autre sens ».

La réponse est assez simple, vous devez faire dans votre nouvelle action:

@account.build_owner

La raison pour laquelle la forme n'a pas afficher à l'aide fields_for était parce qu'il n'a pas un objet valide. Vous avez eu la bonne idée là-haut avec:

@account.owner.build

Cependant, ce n'est pas le travail de belongs_to façon. Cette méthode est uniquement générée avec has_many et has_and_belongs_to_many.

Référence: http://guides.rubyonrails.org/association_basics.html#belongs-to -Association référence

J'utilise Rails 2.3.5 et je remarqué la même chose. Vérification de la source pour la nested_attributes.rb de active_record, il semble que belongs_to devrait fonctionner correctement. Il semble donc qu'il pourrait être un bug « formes imbriquées ».

J'ai une forme imbriquée exactement comme le vôtre, avec User belongs_to :address et Address est indépendant de l'utilisateur.

Ensuite, sous la forme, je fais juste <% f.fields_for :address_attributes do |address_form| %> au lieu de <% f.fields_for :address do |address_form| %>. bidouille temporaire jusqu'à ce que il y a une meilleure façon, mais cela fonctionne. La méthode accepts_nested_attributes_for attend les params inclure quelque chose comme:

{user=>{address_attributes=>{attr1=>'one',attr2=>'two'}, name=>'myname'}

... mais fields_for est la production:

{user=>{address=>{attr1=>'one',attr2=>'two'}, name=>'myname'}

De cette façon, vous n'avez pas d'ajouter que has_one :account à votre code, ce qui ne fonctionne pas dans mon cas.

Mise à jour: Trouvé une meilleure réponse:

Voici l'essentiel du code que je utilise pour faire de ce droit de travail:

Rails imbriqués avec les formes belongs_to Gist

L'espoir qui aide.

class Account < ActiveRecord::Base

    belongs_to :owner  :class_name => 'User', :foreign_key => 'owner_id'
end

Il fonctionne pour moi. : Foreign_key => « OWNER_ID » était le principal problème dans mon cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top