在rails中创建belongs_to关联时,未定义方法1:Integer的“ build_part”

时间:2019-04-07 17:26:05

标签: ruby-on-rails

我有一个Rails应用,其中有一个用户has_one帐户,然后是一个帐户belongs_to用户。我希望其他数据可以从帐户中继承(例如产品或零件)。但是我不知道如何创建新零件并将新零件分配给创建时当前用户的帐户。

我在这里做错了什么?我正在尝试像这样构建新零件:

@account = current_user.account.id
@part = @account.build_part(part_params)

导致此错误:

undefined method `build_part' for 1:Integer when creating a belongs_to association in rails

而且,我也尝试过这样做:

@account = current_user.account.id
@part = @account.build.parts(part_params)

但这给了我这个错误:

undefined method `build' for 1:Integer

在Rails中执行此操作的正确方法是什么? (当前正在运行Rails 6的Beta版。)

以下是相关代码:

模型...

class Account < ApplicationRecord
  belongs_to :user

  has_many :parts
end

class Part < ApplicationRecord
  belongs_to :account
  belongs_to :part_category
  belongs_to :part_unit
end

class User < ApplicationRecord
  include Clearance::User
  has_one :account
end

2 个答案:

答案 0 :(得分:1)

@account = current_user.account.id

是整数,因此当然会导致错误。只需删除id部分。

答案 1 :(得分:1)

您需要获取@account中的帐户记录,而不仅仅是其ID,以便构建与帐户相关的部分。
问题出在代码的这一部分:

@account = current_user.account.id
@part = @account.build_part(part_params)

在这里,我们使用当前用户的帐户ID代替帐户记录来初始化@account。这导致@account保留一个整数值(帐户的ID)。而且,默认情况下,整数没有为其类定义任何称为build_part的方法,这将导致错误!
只需将@account = current_user.account.id更改为@account = current_user.account即可。
您可以阅读有关建立关联的更多信息here