Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在保存之前创建许多相关模型_Ruby On Rails - Fatal编程技术网

Ruby on rails 在保存之前创建许多相关模型

Ruby on rails 在保存之前创建许多相关模型,ruby-on-rails,Ruby On Rails,我有一个带有Desive的用户模型、一个团队模型、一个球员模型和一个教练模型。我希望当用户注册时,其关联团队与关联的培训师和玩家一起创建。我已设置了以下模型: user.rb has_one :team has_one :trainer, :through => :team has_many :players, :through => :team accepts_nested_attributes_for :team, :allow_destroy => true befor

我有一个带有Desive的用户模型、一个团队模型、一个球员模型和一个教练模型。我希望当用户注册时,其关联团队与关联的培训师和玩家一起创建。我已设置了以下模型:

user.rb

has_one :team
has_one :trainer, :through => :team
has_many :players, :through => :team
accepts_nested_attributes_for :team, :allow_destroy => true

before_save :create_team

def create_team
  @team = Team.new(params[:team])
  @team.user = self
  @team.save
end
team.rb

belongs_to :user
has_one :trainer
has_many :players
accepts_nested_attributes_for :trainer, :allow_destroy => true
accepts_nested_attributes_for :player, :allow_destroy => true
trainer.rb和player.rb

belongs_to :team
我没有添加create_trainer和create_player功能,因为我希望用户稍后在游戏中选择它们。因此,在创建用户时,它们应该是空的

但注册过程会产生以下错误:

No association found for name `trainer'. Has it been defined yet?
并指行:

accepts_nested_attributes_for :trainer, :allow_destroy => true
在team.rb中。如果团队模型中没有确定培训师的存在,那么尚未定义培训师项目有什么错?我尝试向Trainer模型添加一些行,将属性设置为默认值,如:

morale.default => (5..12).to_a.sample
但它给出了进一步的错误,所以可能是错误的。非常感谢您的任何评论,尤其是对修补基础的任何批评,因为我是一个noob。

以下几点:

不要在模型中使用实例变量。要访问用户模型中的团队,只需执行
team
self.team

在保存前不要使用
,因为您不想在每次保存用户时创建团队

您的创建团队方法应为:

after_create :my_create_team

def my_create_team
    create_team #create an empty team
end
但是,如果新团队的数据在用户注册时已存在于表单中,则应自动创建该团队,因为您有
接受\u嵌套的\u属性\u:team


我将在这里的评论中回答您的一些问题:

因此,当您添加
时,您现在可以访问所有这些方法(build\u team、create\u team、team=etc)

“空”的意思是,如果你只调用
create\u team
而没有任何属性,它将创建一个“默认”团队:没有名称等,但它将链接到你的用户

如果你想创建一个“空”团队,你可以这样做,我认为:

after_create :create_team
创建自己的方法只允许传递默认参数

但是您可能已经为团队添加了验证,比如验证其名称的存在。 无论如何,由于您有
接受:team的\u嵌套属性,:allow\u destroy=>true
,如果您在注册表单中有用户团队所需的字段,它应该自动创建团队。

有几件事:

不要在模型中使用实例变量。要访问用户模型中的团队,只需执行
team
self.team

在保存前不要使用
,因为您不想在每次保存用户时创建团队

您的创建团队方法应为:

after_create :my_create_team

def my_create_team
    create_team #create an empty team
end
但是,如果新团队的数据在用户注册时已存在于表单中,则应自动创建该团队,因为您有
接受\u嵌套的\u属性\u:team


我将在这里的评论中回答您的一些问题:

因此,当您添加
时,您现在可以访问所有这些方法(build\u team、create\u team、team=etc)

“空”的意思是,如果你只调用
create\u team
而没有任何属性,它将创建一个“默认”团队:没有名称等,但它将链接到你的用户

如果你想创建一个“空”团队,你可以这样做,我认为:

after_create :create_team
创建自己的方法只允许传递默认参数

但是您可能已经为团队添加了验证,比如验证其名称的存在。
无论如何,由于您有
接受:team的\u嵌套属性,:allow\u destroy=>true
,如果您在注册表单中有用户团队所需的字段,它应该会自动创建团队。

谢谢您的回答。我只是一个电脑用户,因此很难适应这些术语。我检查并看到create_other(attributes={})是单数关联(一对一)。这与您编写的函数“创建团队”相同吗?如果是这样的话,没有一行告诉我create_team会创建一个空团队。你能告诉我在哪里可以得到这样实用的信息吗?或者这是一件小事,每个程序员都应该知道吗?如果团队创建失败,用户创建不会成功吗?实现这种依赖性的正确方法是什么(即,如果团队创建失败,则无法创建用户)?感谢您的回答。我只是一个电脑用户,因此很难适应这些术语。我检查并看到create_other(attributes={})是单数关联(一对一)。这与您编写的函数“创建团队”相同吗?如果是这样的话,没有一行告诉我create_team会创建一个空团队。你能告诉我在哪里可以得到这样实用的信息吗?或者这是一件小事,每个程序员都应该知道吗?如果团队创建失败,用户创建不会成功吗?实现这种依赖性的正确方法是什么(即,如果团队创建失败,则用户创建失败)?