控制Rails中的执行顺序创建操作

时间:2013-03-22 06:44:17

标签: ruby-on-rails devise controller order-of-execution

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

在我的应用程序中,团队控制器new和create actions正在多个关联模型中创建几个新记录。其中一条记录无法创建,因为它似乎在@pool_user之前执行了较低的记录@department,因此@department.id为零且电子邮件不能为空。

为了测试,我删除了@pool_user行并在:userid =>下的@competence中插入了一个特定值,并按预期顺序执行,按预期创建所有记录。

我正在使用Devise作为User模型,我怀疑它可能会影响它首先初始化,但我似乎找不到让它们以正确的顺序执行的方法。

teams_controller.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

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

2 个答案:

答案 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控制台中尝试这一切。