Откат ActiveRecord в Rails - PullRequest
       0

Откат ActiveRecord в Rails

2 голосов
/ 28 октября 2019
Rails 5.2

У меня есть частичное:

views/authors/_add_author_comment.html/slim

= form_for :author_note, url: author_notes_url, method: :post do |f|
  = f.hidden_field :author, value: @book.author
  = f.text_area :comment
  button.btn.btn-primary type="button"
  = f.submit t('authors.show.submit_comment')   

В моих контроллерах / author_notes_controller.rb у меня есть:

def create
  @author_note = AuthorNote.new(author: params[:author_note][:author], user_id: current_user.id, comment: params[:author_note][:comment])
  @author_note.save
end

Когда отображается форма (часть увеличенного вида), и я заполняю комментарий и нажимаю «Отправить комментарий», комментарий не сохраняется. В консоли я вижу следующее:

Обработка AuthorNotesController # create as HTML

Parameters: {"utf8"=>"✓", "authenticity_token"=>"Jju1cpsLjXLY/TaF9p/Zkh8JQ/+KajjxwQHgNU4tNU9bjL8BiZQ8xL3S7ske1KqflOPHVaB9UTWRvgxNqzLd7Q==", "author_note"=>{"author"=>"John Dow", "comment"=>"This is a test"}, "commit"=>"Save Note"}
User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = '5' ORDER BY `users`.`id` ASC LIMIT 1
↳ app/controllers/author_notes_controller.rb:23
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = '5' LIMIT 1
↳ app/controllers/author_notes_controller.rb:23
 (0.2ms)  BEGIN
↳ app/controllers/author_notes_controller.rb:28
 (0.1ms)  ROLLBACK
↳ app/controllers/author_notes_controller.rb:28
No template found for AuthorNotesController#create, rendering head :no_content
Completed 204 No Content in 60ms (ActiveRecord: 10.6ms)

Почему ActiveRecord выполняет откат, а не сохраняет заметку в таблице author_notes?

Разрешение:

модель author_note.rb, у меня была: own_to: книга, я закомментировал ее

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Вы не включили свою модель AuthorNote, возможно, существуют некоторые ограничения проверки, которые не позволяют сохранить author_note.

Ваш код также не обрабатывает ошибку проверки, поэтому вы можете захотетьсделать это. Но вы можете просто проверить на наличие ошибок, таких как:

def create
  @author_note = AuthorNote.new(author: params[:author_note][:author], user_id: current_user.id, comment: params[:author_note][:comment])
  @author_note.save
  # puts works too
  logger.debug "author_note save error: #{@author_note.errors.full_messages.join(' ')}"
end
0 голосов
/ 30 октября 2019

Используйте ! вместе с сохранением или созданием, которое покажет сообщение об ошибке Object.save! или Object.create!

def create
   @author_note = AuthorNote.new(author: params[:author_note][:author], user_id: current_user.id, comment: params[:author_note][:comment])
   @author_note.save!
end

ИЛИ

def create
   @author_note = AuthorNote.create!(author: params[:author_note][:author], user_id: current_user.id, comment: params[:author_note][:comment])
end
0 голосов
/ 28 октября 2019

Скорее всего, это связано с тем, что рельсы 5 делают ассоциацию принадлежность_ к требуемой по умолчанию.

Это означает, что для направляющих> 5, если вы определили belongs_to для модели и если соответствующая запись отсутствует. В этом случае book_id должно быть равно нулю в записи AuthorNote. ActiveRecord выдаст ошибку и откатит транзакцию.

Чтобы исправить это, вместо того, чтобы комментировать отношение belongs_to вместе, вы можете сделать его необязательным (поскольку удаление отношения может нарушить работу системы)

class AuthorNote < ApplicationRecord
  belongs_to :book, optional: true
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...