我有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。
答案 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