Что возвращает update_attribute в случае сбоя?

У меня есть следующий кусок кода

@user = User.find(params[:id])
if (@user.activation_status == "active") 
  #some code here 
  @user.update_attribute('activation_status' ,'inactive')  # Line 44
  #send mail to user that his account is Acivated
else

end

Есть ли шанс, что Line 44 может потерпеть неудачу? Поскольку память базы данных переполнена или произошел сбой сети. Что будет в этом случае? Если это создает проблему, как лучше ее избежать? Что значит update_attribute вернуть, если это не удалось?

2 ответа

Вот источник для update_attribute:

def update_attribute(name, value)
  send(name.to_s + '=', value)
  save(false)
end

Вы можете видеть, что он обновляет запрошенный атрибут, а затем вызывает save с perform_validations установлен в false, Следовательно update_attribute вернется false если какой-либо из обратных вызовов сохранения (например, before_save) предотвратил сохранение записи путем возврата false,

Если произошла ошибка нижнего уровня, например, нехватка памяти в базе данных, то я ожидаю, что драйвер базы данных вызовет это как исключение, которое будет передано в ваш код.

Если update_attributes не удается, он вернет false. если вы проигнорируете возвращаемое значение, вы даже не поймете, что это произошло. Вы можете использовать update_attributes!, который в свою очередь вызывает save!, что, в свою очередь, вызывает исключение, если что-то идет не так. Хотя это то, что вы не можете пропустить (если вы не напишете всеохватывающие операторы спасения), но если вы не поймаете это, оно попадет в Rails и прервет запрос.

Обычно хорошей идеей является проверка возвращаемого значения.

Другие вопросы по тегам