Ruby on rails 3 Rails 3:对多个表字段应用相同的验证规则

Ruby on rails 3 Rails 3:对多个表字段应用相同的验证规则,ruby-on-rails-3,validation,rails-activerecord,Ruby On Rails 3,Validation,Rails Activerecord,我已经创建了一个包含多个字段的模型,这些字段应该接受相同的数据格式(字符串,但可以是任何内容,FWIW)。我想对所有这些字段应用相同的验证规则。当然,我可以继续复制/粘贴东西,但这违反了干燥原则,也违背了常识 我想这很简单,但我是Rails的新手/新潮人士,所以请原谅我的一个小问题。=) 因此,如果要验证三个字段: :first_name :last_name :age 你想让他们都被验证?比如说: validates_presence_of :first_name, :last_name,

我已经创建了一个包含多个字段的模型,这些字段应该接受相同的数据格式(字符串,但可以是任何内容,FWIW)。我想对所有这些字段应用相同的验证规则。当然,我可以继续复制/粘贴东西,但这违反了干燥原则,也违背了常识


我想这很简单,但我是Rails的新手/新潮人士,所以请原谅我的一个小问题。=)

因此,如果要验证三个字段:

:first_name
:last_name
:age
你想让他们都被验证?比如说:

validates_presence_of :first_name, :last_name, :age
validates_presence_of :name, :email
编辑:Rails中有许多不同的验证方法,它们非常灵活)。对于字段的格式,可以使用
验证
的格式,然后使用正则表达式与之匹配。下面是一个匹配电子邮件的示例:

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i

我会看看导游;它提供了有关Active Record在验证方面提供的许多功能的全面见解。您还可以查看文档。

如果您使用任何内置验证(存在、长度),您可以对多个属性应用单个验证,如下所示:

validates_presence_of :first_name, :last_name, :age
validates_presence_of :name, :email
如果您有自定义逻辑,您可以创建一个验证器对象来存放代码并单独应用它

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << (options[:message] || "is not an email") unless
      value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
  end
end

def Person
  validates :home_email, :email => true
  validates :work_email, :email => true
end
class EmailValidatortrue
结束
请参阅:

用于此:

# Describe common validation in module
module CommonValidation
  extend Themis::Validation

  validates_presence_of :foo
  validates_length_of :bar, :maximum => 255
end

class ModelA < ActiveRecord::Base
  # import validations
  include CommonValidation
end

class ModelB < ActiveRecord::Base
  # import validations
  include CommonValidation
end
#描述模块中的常见验证
模块公共验证
扩展Themis::验证
验证是否存在:foo
验证的长度为:bar,:max=>255
结束
类ModelA
在Rails 4中,您可以使用一个循环对多个列应用相同的验证:

[:beds, :baths].each do |column|
  validates column, allow_blank: true, length: { maximum: 25 }
end
床和浴都使用相同的验证进行验证

编辑:

在Rails4.2中,您可以通过在validates函数调用之后放置多个符号来完成同样的任务。例如:

validates :beds, :baths, allow_blank: true
或者您可以使用“with_options”,例如:

with_options presence: true do |video|
  REQUIRED_COLUMNS.map do |attr|
   video.validates attr
  end
end

是的,但是像regex match这样更具异国情调的东西呢?没问题!我还附上了一些细节/资源。如果你发现这个答案是一个解决方案,请点击我帖子旁边的图标“接受”。这将表明问题已经结束,您对我的帮助感到满意。祝你学习rails好运!谢谢Jon,我一直在问一些关于Rails的琐碎问题,我在Google上找不到,因为它们太琐碎了,连鸟都知道。但是是的。。。谢谢你的回复,看来我需要更多的运气来使用我的大脑!=)再次感谢你!它们绝对不是无关紧要的问题;每个人都会学到这些东西,这些问题都会被问到。许多编程文档的问题在于,它们是由对该主题有深入了解的人编写的,而这些东西都是不可能的。但是信息就在那里!apidock建议电子邮件格式验证使用:
validates:email,格式:{with://\A([^@\s]+)@((?:[-A-z0-9]+\)+[A-z]{2,})\z/i,on::create}