Получение fields_for и accepts_nested_attributes_for для работы с отношением own_to
Кажется, я не могу получить вложенную форму для создания в представлении рельсов для отношения 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
Возможно, именно здесь я делаю это "rong", поскольку у учетной записи могут быть "владельцы" и "пользователи", но у пользователя есть только одна "учетная запись" на основе пользовательской модели 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
Если я попытаюсь использовать таинственный метод 'build', он просто запускается в контроллере, возможно, потому что сборка предназначена только для отношений с несколькими записями:
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 [владелец] не разрешен как имя переменной экземпляра".
У кого-нибудь еще есть новый метод accepts_nested_attributes_for, работающий с отношением own_to? Есть что-то особенное или другое, что вам нужно делать? Все официальные примеры и пример кода (например, отличный материал в Ryans Scraps) связаны с ассоциациями с несколькими записями.
Ответы
Ответ 1
Я думаю, что ваш 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.
Вы можете увидеть больше примеров в документах.
Ответ 2
Я немного опоздал на несколько месяцев, но я искал эту ошибку, и моя ситуация состояла в том, что я не мог изменить отношение, чтобы "смотреть в другую сторону".
Ответ на самом деле довольно прост, вы должны сделать это в своем новом действии:
@account.build_owner
Причина, по которой форма не отображалась с помощью полей_поиск, состояла в том, что у нее не было допустимого объекта. Там была правильная идея:
@account.owner.build
Однако это не работает belongs_to
. Этот метод генерируется только с помощью has_many
и has_and_belongs_to_many
.
Ссылка:
http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference
Ответ 3
Я использую Rails 2.3.5, и я заметил то же самое. Проверяя источник для active_record nested_attributes.rb, похоже, что role_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
ожидает, что params будет включать что-то вроде:
{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
Надеюсь, что это поможет.
Ответ 4
class Account < ActiveRecord::Base
belongs_to :owner :class_name => 'User', :foreign_key => 'owner_id'
end
Это работает для меня.: foreign_key = > 'owner_id' была ключевой проблемой в моем случае.