Ruby和一般编程的新手。到目前为止,我找到任何问题的答案都没有问题,但找不到这个。
在我的应用程序中,团队控制器new和create actions正在多个关联模型中创建几个新记录。其中一条记录无法创建,因为它似乎在@pool_user
之前执行了较低的记录@department
,因此@department.id
为零且电子邮件不能为空。
为了测试,我删除了@pool_user
行并在:userid =>
下的@competence
中插入了一个特定值,并按预期顺序执行,按预期创建所有记录。
我正在使用Devise作为User模型,我怀疑它可能会影响它首先初始化,但我似乎找不到让它们以正确的顺序执行的方法。
def new
@team = Team.new
@department = Department.new
@competence = Competence.new
@pool_user = User.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @team }
end
end
def create
@team = Team.new(params[:team])
@department = @team.departments.build(:organization_id => User.current.organization_id, :team_id => @team.id)
@pool_user = @team.users.build(:email => @department.id).save(:validate => false)
@competence = @team.competences.build(:team_id => @team.id, :user_id => @pool_user.id)
respond_to do |format|
if @team.save
format.html { redirect_to @team, notice: 'Team was successfully created.' }
format.json { render json: @team, status: :created, location: @team }
else
format.html { render action: "new" }
format.json { render json: @team.errors, status: :unprocessable_entity }
end
end
end
随意纠正您在此处看到的任何其他不良行为或一般菜鸟行动。我只想弄清楚为什么它没有以正确的顺序构建。谢谢。
答案 0 :(得分:1)
问题不在于执行顺序。问题是.build
在内存中创建了一个对象,但是还没有将它保存到数据库中。这就是为什么你还没有id
。您可能希望改为使用.create
。
您的代码的另一个问题是,您在没有必要时传递:team_id => @team.id
。
在此代码中:
@team.departments.build
:team_id
将由build
方法隐式设置。所以,您可以这样做:
@department = @team.departments.build(:organization_id => ...)
答案 1 :(得分:1)
只是在集合上调用构建实际上不会保存记录。您需要在使用id属性之前保存它。
执行后,
@team = Team.new(params[:team])
或
@department = @team.departments.build(:organization_id => User.current.organization_id, :team_id => @team.id)
@ team.id或@ department.id会给你零值。
同样
@team.users.build(:email => @department.id).save(:validate => false)
将返回布尔值,即true或false。
构建之后,如果需要,应该明确保存此值,例如
@team = Team.new(params[:team])
@team.save
和
@pool_user = @team.users.build(:email => @department.id)
@pool_user.save(:validate => false)
应该有用。
我建议您在实际编写任何代码之前在rails控制台中尝试这一切。