मेरे पास 2 मॉडल हैं - कुत्ते और हड्डी। कुत्ते के पास हड्डी है, हड्डी कुत्ते से संबंधित है। कुत्ते का नाम है, हड्डी का रंग और कुत्ते_आईडी है।
संपादन फॉर्म में उपयोगकर्ता कुत्ते के नाम और हड्डी के रंग को बदल सकता है। मुझे अद्यतन डीबी से पहले कुत्ते और हड्डी की मान्यताओं को चलाने की जरूरत है। मेरा कोड यहाँ है:
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
इस मामले में, यदि कुत्ता वैध है और हड्डी नहीं है, तो यह केवल डीबी में कुत्ते की प्रगति को बचाएगा और फिर फिर से संपादित करेगा। लेकिन मैं उन सभी के वैध होने से पहले डीबी बदलना नहीं चाहता हूं।
उत्तर:
जवाब के लिए 2 № 1एक और व्यवहार्य तरीका उपयोग कर रहा है 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)
अगर वे मान्य हैं तो अद्यतन कर रहे हैं।
उत्तर № 2 के लिए 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