【问题标题】:Rails Validation Errors not being displayedRails 验证错误未显示
【发布时间】:2020-07-07 13:51:31
【问题描述】:

由于某种原因,我的验证错误被拾取但没有显示在页面上,因为我希望下面是我的模型和新视图。我还将附上一张我的验证错误被拾取但未显示在视图中的图片。

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 %>

【问题讨论】:

  • 您可能想使用save 而不是save!
  • 我认为是因为您使用的是save!。
  • 我完全错过了我还有保存!在另一个我忘记的分支上工作,谢谢!
  • 您还使用&lt;%= form_for Review.new do |f|%&gt; 而不是&lt;%= form_for @review do |f|%&gt;。对于前者,任何用户输入都会丢失。

标签: ruby-on-rails ruby validation error-handling


【解决方案1】:

在 Ruby 中有一个约定,以 ! 结尾的方法表示“危险”方法。该方法要么改变其接收者,要么引发异常。 ActiveRecord::Persistence 有正常和“危险”两种方法:

  • save 和 save!
  • create 和 create!
  • update 和 update!

如果任何验证失败,后者会引发ActiveRecord::RecordInvalid 异常。当您从种子文件、测试或事务中创建记录时,这非常有用。

但是当您通常处理用户输入时,您希望使用正常的save 方法,因为无效输入只是生活中的事实,而不是异常事件。如果您依赖将代码更改为 .save! 进行调试,您应该真正学会使用 pry 或 byebug 来代替单步执行代码。

您还应该修复表单,以便将其绑定到@review 实例变量,这样用户的输入就不会被删除。没有人喜欢糟糕的表单,让他们重新输入所有内容。

<%= form_for @review.new do |f|%>
  # ...
<% end %>

【讨论】:

    【解决方案2】:

    您没有在对象上遇到错误,因为您正在调用引发异常的 save 版本。

    查看#save! 与#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

    【讨论】:

      【解决方案3】:

      .保存!不允许视图呈现错误,如图所示调整创建方法允许显示错误。

      主要原因是 rails bang (!) methods 用于引发错误,而不仅仅是处理和传递错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-20
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2015-09-14
        • 2011-01-28
        • 2017-05-25
        • 2012-12-14
        相关资源
        最近更新 更多