Ошибки валидации Rails не отображаются - PullRequest
0 голосов
/ 26 марта 2020

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

Model

class Review < ApplicationRecord
  belongs_to :user
  belongs_to :tea

  validates :title, presence: true
  validates :rating, numericality: {only_integer: true, greater_than_or_equal_to: 0, less_than: 11}
  validates :tea, uniqueness: {scope: :user, message: "has already been reviewed by you" }

  scope :order_by_rating, ->{group(:id).order('avg(reviews.rating) desc')}
end
View
<h1>Write a Review for  </h1>

<%= form_for Review.new do |f|%>
    <% if @review.errors.any? %>
        <h2>Errors:</h2>
        <ul>    
            <% @review.errors.full_messages.each do |message| %>
            <li><%= message %></li>
           <% end %> 
        </ul>
    <% end %>

Validation Error

Ответы [ 3 ]

1 голос
/ 27 марта 2020

В Ruby существует соглашение, что методы, заканчивающиеся на !, обозначают «опасный» метод. Метод либо изменяет свой получатель, либо вызывает исключение. ActiveRecord::Persistence имеет как нормальные, так и "опасные" методы:

  • save и save!
  • create и create!
  • update и update!

В последнем случае возникает исключение ActiveRecord::RecordInvalid, если какая-либо из проверок не пройдена. Это действительно полезно, когда вы создаете записи из исходного файла, в своих тестах или внутри транзакции.

Но когда вы обычно обрабатываете пользовательский ввод, вы хотите использовать обычный метод save в качестве неверного ввода это просто жизненный факт, а не исключительное событие. Если вы полагаетесь на изменение кода на .save! для отладки, вам действительно следует научиться использовать pry или byebug вместо того, чтобы войти в код.

Вы также должны исправить форму, чтобы привязать ее к @review переменная экземпляра, чтобы пользовательский ввод не удалялся. Никто не любит плохо реализованные формы, которые заставляют их перепечатывать все.

<%= form_for @review.new do |f|%>
  # ...
<% end %>
0 голосов
/ 26 марта 2020

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

Ознакомьтесь с документацией по #save! vs #save: https://apidock.com/rails/ActiveRecord/Base/save%21

Это не лучшее место для использования #save!, вместо этого вы должны делать что-то с #save, например:

if @review.save
  # redirect
else
  # You can now access the `#errors` method if you want
  errors = @review.errors
end

Прочтите это для получения дополнительной информации об ошибке ActiveRecord обработка: https://api.rubyonrails.org/classes/ActiveModel/Errors.html

0 голосов
/ 26 марта 2020

.save! не позволял представлению отображать ошибки, как показано, корректировка метода create позволяет отображать ошибки.

Основная причина этого заключается в том, что рельсы bang (!) methods используются для вызова ошибок, а не просто для их обработки и передачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...