29

我似乎无法使用Rails 2.3belongs_to的新功能在 Rails 视图中生成嵌套表单以生成关系。accepts_nested_attributes_for我确实检查了许多可用的资源,看起来我的代码应该可以正常工作,但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 方法来处理belongs_to 关系?你有什么特别或不同的事情要做吗?所有官方示例和示例代码(如Ryans Scraps 上的精彩内容)都与多记录关联有关。

4

4 回答 4

46

我已经晚了几个月,但我正在寻找解决这个错误的方法,而我的情况是我无法将这种关系改变为“面对另一个方向”。

答案真的很简单,你必须在你的新动作中这样做:

@account.build_owner

使用 fields_for 没有显示表单的原因是它没有有效的对象。你有正确的想法:

@account.owner.build

然而,这不是belongs_to工作方式。此方法仅使用has_many和生成has_and_belongs_to_many

参考: http: //guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

于 2010-03-14T07:16:23.733 回答
8

我认为你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 的帐户。

您可以在docs中查看更多示例。

于 2009-08-21T17:33:14.883 回答
8

我正在使用 Rails 2.3.5,我注意到了同样的事情。查看 active_record 的nested_attributes.rb 的源代码,belongs_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到您的代码中,这在我的情况下不起作用。

更新:找到更好的答案:

这是我用来使这项工作正常进行的代码的要点:

带有 belongs_to 要点的 Rails 嵌套表单

希望有帮助。

于 2010-01-13T00:12:36.370 回答
-3
class Account < ActiveRecord::Base

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

这个对我有用。:foreign_key => 'owner_id' 是我的关键问题。

于 2010-08-19T14:52:48.963 回答