Pregunta

Me parece que no puede conseguir una forma anidada para generar en unos raíles ver una relación belongs_to utilizando la nueva instalación accepts_nested_attributes_for de Rails 2.3. Comprobé que muchos de los recursos disponibles y parece que mi código debe estar trabajando, pero explota fields_for en mí, y sospecho que tiene algo que ver con la forma en que tengo los modelos anidados configurados.

El error de golpeo es común que puede tener muchas causas:

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

Estos son los dos modelos involucrados:

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

Tal vez esto es donde yo estoy haciendo 'rong', como una cuenta puede tener un 'propietario', y puede 'usuarios', pero un usuario sólo tiene una 'cuenta', basada en la clave account_id modelo de usuario.

Este es el código de la vista en new.html.haml que sopla en mí:

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

Y este es el código del controlador de la nueva acción:

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

Cuando intento cargar / account / nuevo me sale el siguiente excepción:

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 trato de utilizar el método misteriosa 'construir', sólo bombas a cabo en el controlador, tal vez porque la construcción es sólo para las relaciones de varios registros:

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 trato de hacerlo usando @ account.owner_attributes = {} en el controlador, o @ account.owner = User.new, estoy de vuelta al error original ", @account [el propietario] no está permitido como una instancia nombre de la variable".

¿Alguien más tiene el nuevo método accepts_nested_attributes_for trabajar con una relación belongs_to? ¿Hay algo especial o diferente que tiene que hacer? Todos los ejemplos oficiales y código de ejemplo (como el grandes cosas encima en Ryans Recortes ) se ocupa de las asociaciones de varios registros.

¿Fue útil?

Solución

Creo que su accepts_nested_attributes está en el lado equivocado de la relación. Tal vez algo como esto funcionaría?

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

Para la construcción de la cuenta que desea utilizar build_account.

Usted puede ver más ejemplos en los documentos .

Otros consejos

Estoy de unos meses demasiado tarde, pero yo estaba buscando para resolver este error y mi situación era que no podía cambiar la relación 'enfrentar a la inversa'.

La respuesta en realidad es bastante simple, usted tiene que hacer esto en su nueva acción:

@account.build_owner

La razón por la forma no visualizar utilizando fields_for fue porque no tenía un objeto válido. Tenías la idea a la altura de:

@account.owner.build

Sin embargo, este no es el trabajo de manera belongs_to. Este método sólo se genera con has_many y has_and_belongs_to_many.

Referencia: http://guides.rubyonrails.org/association_basics.html#belongs-to -asociación-referencia

Estoy usando Rails 2.3.5 y me di cuenta de lo mismo. La salida a la fuente de nested_attributes.rb de active_record, parece que belongs_to debería funcionar bien. Así que parece que podría ser un error "formas anidadas".

Tengo una forma anidada exactamente igual que la suya, con User belongs_to :address y Address es independiente del usuario.

A continuación, en la forma, sólo que en lugar de <% f.fields_for :address_attributes do |address_form| %> <% f.fields_for :address do |address_form| %>. truco temporal hasta que hay una manera mejor, pero esto funciona. El método accepts_nested_attributes_for está a la espera de los parametros incluir algo como:

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

... pero fields_for está produciendo:

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

De esta manera usted no tiene que añadir que has_one :account a su código, que no funciona en mi caso.

Actualización: Encontrado una mejor respuesta:

Esta es la esencia del código que estoy usando para hacer este trabajo derecha:

Rails Formas anidadas con belongs_to Gist

Espero que ayude.

class Account < ActiveRecord::Base

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

A mí me funciona. : Foreign_key => 'OWNER_ID' fue el problema clave en mi caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top