Обновление записей базы данных в Rails - PullRequest
0 голосов
/ 11 июня 2018

Я новичок в RoR, и теперь я путаюсь с обновлением данных в базах данных.И я недавно изучал RoR, если вопрос неясен, пожалуйста, дайте мне знать.

Предположим, я создал таблицу "книга" с 3 столбцами: "имя", "цена" и "автор".

При реализации обновления действия в рельсах я сделаю следующее:

def update
  @book = Book.find(params[:id])
  if @book.update({'name': 'Ruby tutorial'})
    redirect_to @book
  else
    render 'edit'
  end
end

Это обновит запись в базе данных на

if @article.update({'name': 'Ruby tutorial'})

, чтобы протестировать некоторыеВ случае сбоя я специально изменил столбец базы данных «name» на «nane», подумал, что оператор if @ article.update завершится ошибкой из-за неправильного имени поля таблицы и код перейдет в блок else,Потому что я подумал, что этот оператор предназначен для проверки, успешно ли rails сохраняет запись в базе данных.

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

Я запутался в этом поведении, какие ситуации вызовут , если @ article.update (params) завершится неудачно и перейдет в блок else?

Является ли if @ article.update(params) только для проверки данных формы?т. е. проверка правильности хеш-ключа, отправленного из формы, например, для стороны базы данных (имя поля или ошибка соединения с базой данных), не является делом этого оператора, поэтому он выдаст исключение.

Большое спасибо.

1 Ответ

0 голосов
/ 11 июня 2018
@book.update(nane: 'name')

выдаст исключение ActiveModel :: UnknownAttributeError: неизвестный атрибут.

, если не является обработчиком исключений.

Целью использования блока if и else здесь является обработка отрицательного сценария (обновление не удалось из-за некоторых ошибок проверки).

update(name: '')

с проверкой присутствия в столбце имени не будет выдаватьисключение.Он вернет ложь.Если у вас нет блока if / else и вы просто обновляете оператор, вы не будете знать, было ли обновление успешным или нет.

Другой способ справиться с этим - использовать обновление с ! .Добавление!выдает исключение для любых сбоев.

begin
  update!(name '')
rescue Exception
  render 'edit'
end

Спасение исключения, как указано выше, является плохим стилем обработки исключения. Я удалил

rescue Exception
  //some action //
end

Вы должны узнать, почему отсюда Почему плохой стиль `спасать Exception => e` в Ruby? .

Вы также можете обрабатывать определенные исключения RecordInvalid, как это.

begin
  update!(name '')
rescue ActiveRecord::RecordInvalid => invalid
   // some action //
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...