Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证之前*是否存在_Ruby On Rails_Validation - Fatal编程技术网

Ruby on rails 验证之前*是否存在

Ruby on rails 验证之前*是否存在,ruby-on-rails,validation,Ruby On Rails,Validation,比如说,我有一个before_验证,检查以确保名称的第一个字母是“y”: 但我想确保名字也存在: validates :name, presence: true 但这将在验证是否存在名字之前运行before_验证,对吗?在运行之前验证之前,如何检查名称是否存在 我可以试试: after_validation :check_name_first_letter_is_y 但是如果我返回false,这会停止save方法吗?还是因为已经验证过而太晚了?通过一次调用就可以做到这一点,如下所示(如果我没

比如说,我有一个before_验证,检查以确保名称的第一个字母是“y”:

但我想确保名字也存在:

validates :name, presence: true
但这将在验证是否存在名字之前运行before_验证,对吗?在运行之前验证之前,如何检查名称是否存在

我可以试试:

after_validation :check_name_first_letter_is_y

但是如果我返回false,这会停止save方法吗?还是因为已经验证过而太晚了?

通过一次调用就可以做到这一点,如下所示(如果我没有误读您的问题!):

更新:

引入一个新的
ActiveModel::EachValidator
,它将检查名称中的第一个字符是否为
y
,并像通常一样使用状态验证程序,但确保状态验证程序位于
名称
验证程序之前,以便在检查第一个字母之前完成状态检查

# app/validators/NameValidator.rb

class NameValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.initial != 'y'
      record.errors[attribute] << (options[:message] || "First letter in name must be `y`")
    end
  end
end
请参阅:


还建议您为
NameValidator
类提供一个“Railsy”名称

您只需添加第二个格式验证:

validates :name, presence: true, format: { with: /^y/, allow_blank: true }

标准问题:为什么需要这样做?
检查\u name\u first\u letter\u是\u y
如果第一个字母不是
y
,该怎么办?你能将lambda作为验证器选项传递吗?@BroiSatse,是的。看:嗯。。我的实际情况比这要复杂一些,但我想我会简化这个问题。我想知道是否必须将验证:名称、状态:true切换为自定义验证,例如,在验证之前:name\u present?@JacksonCunningham,可以对同一个属性进行多个验证。记住顺序很重要。因此,首先检查是否存在,然后检查第一个字母,而不是在验证之前。那应该更简单,你不觉得吗?
# app/validators/NameValidator.rb

class NameValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.initial != 'y'
      record.errors[attribute] << (options[:message] || "First letter in name must be `y`")
    end
  end
end
validates :name, presence: true
valdiates :name, name: true
validates :name, presence: true, format: { with: /^y/, allow_blank: true }