Rails:在事务中保存嵌套属性

时间:2014-03-05 18:40:00

标签: ruby-on-rails activerecord ruby-on-rails-4 transactions nested-attributes

我有一个接受嵌套属性的用户模型:

class User < ActiveRecord::Base
  has_many :skills
  accepts_nested_attributes_for :skills
end

在我的控制器中,我正在更新交易内的用户:

def update
  @user = current_user
  @profile = current_profile

  begin
    User.transaction do
      @user.update_attributes!(user_params)
      @profile.update_attributes!(profile_params)
    end

    redirect_to user_path(@user)
  rescue
    render :edit
  end
end

当用户更新成功但配置文件更新失败(即验证错误等)时,将使用嵌套技能呈现编辑模板。奇怪的是,嵌套技能属性具有ID,因此当我重新提交编辑表单时,我得到:

ActiveRecord::RecordNotFound
Couldn't find Skill with ID=123 for User with ID=456

我相信这里发生的事情是,由于用户更新成功,因此创建了嵌套技能。配置文件更新失败,并回滚整个事务(包括技能)。我希望在重新呈现表单时,新创建的技能的ID应为空白。

这是一个错误吗?这里有更好的方法吗?

谢谢!

0 个答案:

没有答案