ruby-on-rails - 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 })
打印语句和断点永远不会被触发。我确定这很简单,我只是无法弄清楚它是什么。
解决方案
假设这SignUpForm
是一个 Ruby on Rails 模型。代码没有被触发的原因很简单。
sign_up_form = SignUpForm.new(year: 2021, month: 3, day: 25)
实例化一个新对象。然而,实例化一个对象并不会自动触发验证。要触发这些,您必须调用valid?
, invalid?
,validate
或validate!
(最后一个引发异常)。
sign_up_form.valid?
如果返回,应该返回true
/false
并设置相应的错误false
。这些可通过sign_up_form.errors
.
如果您的类是一个完整的 Ruby on Rails 模型save
,update
等将调用上述方法之一,以确保实例在将数据发送到数据库之前是有效的。您应该知道有些方法会跳过验证。