/ / अद्यतन डीबी - रूबी-ऑन-रेल, रूबी-ऑन-रेल -4 से पहले कई मॉडलों के साथ सीआरयूडी की अद्यतन कार्रवाई में सत्यापन चलाएं

अद्यतन डीबी - रूबी-ऑन-रेल, रूबी-ऑन-रेल -4 से पहले कई मॉडलों के साथ सीआरयूडी की अद्यतन कार्रवाई में मान्यताओं को चलाएं

मेरे पास 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