Получение полей_for и Accepts_nested_attributes_for для работы с отношением «принадлежит_к»

StackOverflow https://stackoverflow.com/questions/1313149

Вопрос

Кажется, я не могу создать вложенную форму в представлении рельсов для belongs_to отношения с использованием нового accepts_nested_attributes_for возможности Rails 2.3.Я проверил многие доступные ресурсы, и это похоже на мой код. должен работать, но fields_for взрывается на мне, и я подозреваю, что это как-то связано с тем, как у меня настроены вложенные модели.

Ошибка, с которой я столкнулся, является распространенной и может иметь множество причин:

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

Вот две задействованные модели:

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

Возможно, именно здесь я делаю это «неправильно», поскольку учетная запись может иметь «владельца» и может иметь «пользователей», но у пользователя есть только одна «учетная запись», основанная на ключе account_id модели пользователя.

Вот код представления в new.html.haml, который меня поразил:

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

А это код контроллера для нового действия:

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

Когда я пытаюсь загрузить /account/new, я получаю следующее исключение:

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

Если я попытаюсь использовать загадочный метод «сборки», он просто взорвется в контроллере, возможно, потому, что сборка предназначена только для отношений с несколькими записями:

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

Если я попытаюсь настроить это с помощью @account.owner_attributes = {} в контроллере или @account.owner = User.new, я вернусь к исходной ошибке: «@account[owner] не разрешен в качестве экземпляра имя переменной».

Есть ли у кого-нибудь еще новый метод Accepts_nested_attributes_for, работающий с отношением own_to?Есть ли что-то особенное или необычное, что вам нужно сделать?Все официальные примеры и примеры кода (например, отличные вещи в Ryans Scraps) касается ассоциаций с несколькими записями.

Это было полезно?

Решение

Я думаю, твой accepts_nested_attributes находится на неправильной стороне отношений.Может быть, что-то вроде этого сработает?

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

Для создания учетной записи вы хотите использовать build_account.

Больше примеров вы можете увидеть в документы.

Другие советы

Я опоздал на несколько месяцев, но я пытался исправить эту ошибку, и моя ситуация заключалась в том, что я не мог изменить отношения, чтобы «повернуться в другую сторону».

Ответ на самом деле довольно прост, вам нужно сделать это в новом действии:

@account.build_owner

Причина, по которой форма не отображалась с использованием полей_for, заключалась в том, что у нее не было допустимого объекта.У вас была правильная идея:

@account.owner.build

Однако это не тот путь belongs_to работа.Этот метод генерируется только с has_many и has_and_belongs_to_many.

Ссылка:http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

Я использую Rails 2.3.5 и заметил то же самое.Проверив исходный код вложенного_атрибутов.rb Active_record, похоже, что own_to должен работать нормально.Похоже, это может быть ошибка «вложенных форм».

У меня есть вложенная форма, точно такая же, как ваша, с User belongs_to :address, и Address не зависит от пользователя.

Затем в форме я просто делаю <% f.fields_for :address_attributes do |address_form| %> вместо <% f.fields_for :address do |address_form| %>.Временный хак, пока не появится лучший способ, но это работает.Метод accepts_nested_attributes_for ожидает, что параметры будут включать что-то вроде:

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

...но fields_for производит:

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

Таким образом, вам не нужно это добавлять has_one :account к вашему коду, который в моем случае не работает.

Обновлять:Нашел лучший ответ:

Вот суть кода, который я использую, чтобы все работало правильно:

Вложенные формы Rails с own_to Gist

Надеюсь, это поможет.

class Account < ActiveRecord::Base

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

Меня устраивает.:foreign_key => 'owner_id' был ключевой проблемой в моем случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top