在更新db之前,在具有多个模型的CRUD的更新操作中运行验证

时间:2014-07-05 17:22:17

标签: ruby-on-rails ruby-on-rails-4

我有2个模特 - 狗和骨头。狗has_one骨,骨属于狗。狗有名字,骨头有颜色和狗狗。

在编辑表单中,用户可以更改狗的名字和骨头的颜色。 我需要在更新db之前运行狗和骨骼的验证。这是我的代码:

def update
  @dog = Dog.find(params[:id])
  @bone = @dog.bone

  if @dog.update(dog_params) && @bone.update(bone_params)
    redirect_to root_path
  else
    render :edit
  end
end

在这种情况下,如果dog有效且骨骼不存在,它将仅保存狗在db中的进度,然后再次渲染编辑。但是我不想在所有数据库都有效之前更改db。

2 个答案:

答案 0 :(得分:2)

更可行的方法是使用 accepts_nested_attributes_for

#app/models/dog.rb
Class Dog < ActiveRecord::Base

has_one :bone
accepts_nested_attributes_for :bone
#your validations

end

update方法为

def update
  @dog = Dog.find(params[:id])

  if @dog.update(dog_params)
    redirect_to root_path
  else
    render :edit
  end
end 

private

def dog_params
  params.require(:dog).permit(:name,bone_attribues: [:id,:color,:dog_id])
end

如果 attributes(both parent and child) 有效,我们会确保更新。

答案 1 :(得分:1)

只需在每个型号上调用valid?

def update
  @dog = Dog.find(params[:id])
  @bone = @dog.bone

  @dog.assign_attributes dog_params
  @bone.assign_attributes bone_params

  if @dog.valid? && @bone.valid?
    @dog.save
    @bone.save
    redirect_to root_path
  else
    render :edit
  end
end