首页 > 解决方案 > Rails 表单验证不调用方法

问题描述

我在 Rails 中有一个简单的验证表单类,我一生都无法弄清楚为什么它没有调用我拥有的辅助方法。这是整个班级:

class SignUpForm

  model_fields :month, :day, :year 

  validates_presence_of :month, :day, :year
  validate :validate_sign_up_date

  def validate_sign_up_date
    byebug
    puts "here"
    message = "Please enter a valid date."
    errors.add :sign_up_date, message unless Date.valid_date?(year, month, day)
  end
end

我把这门课称为SignUpForm.new( {year: 2021, month: 3, day: 25 })

打印语句和断点永远不会被触发。我确定这很简单,我只是无法弄清楚它是什么。

标签: ruby-on-railsruby

解决方案


假设这SignUpForm是一个 Ruby on Rails 模型。代码没有被触发的原因很简单。

sign_up_form = SignUpForm.new(year: 2021, month: 3, day: 25)

实例化一个新对象。然而,实例化一个对象并不会自动触发验证。要触发这些,您必须调用valid?, invalid?,validatevalidate!(最后一个引发异常)。

sign_up_form.valid?

如果返回,应该返回true/false并设置相应的错误false。这些可通过sign_up_form.errors.

如果您的类是一个完整的 Ruby on Rails 模型saveupdate等将调用上述方法之一,以确保实例在将数据发送到数据库之前是有效的。您应该知道有些方法会跳过验证


推荐阅读