1

Ruby 和一般编程的新手。到目前为止,我在找到任何问题的答案时都没有遇到任何问题,但找不到这个问题。

在我的应用程序中,Teams 控制器新建和创建操作正在跨多个关联模型创建多个新记录。其中一条记录未能创建,因为似乎较低的记录@pool_user之前正在执行@department,因此@department.id为 nil 并且 email 不能为空。

为了测试,我删除了该@pool_user行并将特定值插入:userid =>under@competence并按预期顺序执行,按预期创建所有记录。

我正在为用户模型使用设计,我怀疑它可能会首先影响它的初始化,但我似乎无法找到一种方法让它们以正确的顺序执行。

团队控制器.rb

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

随时纠正您在此处看到的任何其他不良做法或一般菜鸟动作。我只是想弄清楚为什么它没有按正确的顺序构建。谢谢。

4

2 回答 2

1

问题不在于执行顺序。问题是.build在内存中创建了一个对象,但还没有将它保存到数据库中。这就是为什么你还id没有。您可能想.create改用。

您的代码的另一个问题是您在:team_id => @team.id不需要时通过。

在这段代码中:

@team.departments.build

:team_id将由build方法隐式设置。因此,您可以简单地执行以下操作:

@department = @team.departments.build(:organization_id => ...)
于 2013-03-22T06:57:26.303 回答
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 将为您提供 nil 值。

同样

@team.users.build(:email => @department.id).save(:validate => false) 

将返回布尔值,即真或假。

构建后,如果需要,您应该明确保存此值,例如

    @team = Team.new(params[:team])
    @team.save

    @pool_user = @team.users.build(:email => @department.id)
    @pool_user.save(:validate => false)

应该管用。

我建议您在实际编写任何代码之前在 Rails 控制台中尝试这一切。

于 2013-03-22T07:01:42.197 回答