Часто более удобно использовать вариант сохранения и спасения, вызывающий исключения, который позже в блоке, чем ветвление подобным образом.Преимущество исключений заключается в том, что они прерывают транзакции.
def create
@project.save!
respond_to do |format|
format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') }
format.js
end
rescue ActiveRecord::RecordInvalid
respond_to do |format|
format.html { render :action => "edit" }
format.js #...
end
end
Вы обнаружите, что действительно сложно вырваться из груды вложенных операторов if
при попытке сохранить большечем один объект за раз, но простой rescue
для исключений будет обрабатывать его аккуратно.
def create
Project.transaction do
@project.save!
@something_else.save!
@other_stuff.save!
end
# ...
rescue ActiveRecord::RecordInvalid
# ...
end
Если взорвется любой из этих сохранений, вы получите исключение.Чтобы убедиться, что все они отображают ошибки проверки, вам, возможно, придется вызывать .valid?
для каждой из них, чтобы восполнить их, или они будут у вас после того, как ошибка не будет проверена.