Я хочу сохранить две модели в одном действии контроллера или не сохранить их и вернуться с ошибками проверки.Сохраните обе модели или нет в контроллере
Есть ли лучший способ, чем это?
def update
@job = Job.find(params[:id])
@location = @job.location
@job.assign_attributes(job_params)
@location.assign_attributes(location_params)
@job.save unless @job.valid? # gets validation errors
@location.save unless @location.valid? # gets validation errors
if @job.valid? && @location.valid?
@job.save
@location.save
flash[:success] = "Changes saved."
redirect_to edit_job_path(@job)
else
render 'edit'
end
end
Новая версия:
def update
@job = Job.find(params[:id])
@location = @job.location
begin
Job.transaction do
@job.assign_attributes(job_params)
@job.save!(job_params)
@location.assign_attributes(location_params)
@location.save!(location_params)
end
flash[:success] = "Changes saved."
redirect_to edit_job_path(@job)
rescue ActiveRecord::RecordInvalid => invalid
render 'edit'
end
end
Почему вы звоните 'save' дважды для каждого экземпляра? – AbM
Если вы не хотите использовать 'nested_attributes', как предлагаемые ответы (что я рекомендую), вы можете использовать транзакцию ActiveRecord # (http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html) и используйте 'save!' внутри этого блока, отмените ошибку «Record not valid» и сделайте правильный просмотр. – MrYoshiji
Спасибо MrYoshiji! Причиной принятия accepts_nested_attributes_for является то, что job принадлежит_определению. –