Rails 3: применять одни и те же правила проверки к нескольким полям таблицы - PullRequest
14 голосов
/ 21 марта 2012

Я создал модель с несколькими полями, которые должны принимать один и тот же формат данных (строки, но могут быть любыми, FWIW). Я хотел бы применить одно и то же правило проверки ко всем этим полям. Конечно, я могу просто скопировать / вставить материал, но это противоречит принципу СУХОЙ и здравому смыслу ...

Полагаю, это довольно просто, но я новичок / хипстер из Rails, поэтому excuse-moi за тривиальный вопрос. =)

Ответы [ 5 ]

21 голосов
/ 21 марта 2012

Итак, если бы вы сказали три поля для проверки:

:first_name
:last_name
:age

И вы хотели, чтобы все они были проверены?Итак, что-то вроде этого:

validates_presence_of :first_name, :last_name, :age

Edit: В Rails существует множество различных методов валидации), и они удивительно гибки).Для формата поля вы можете использовать validates_format_of, а затем использовать регулярное выражение для сопоставления с ним.Вот пример соответствия электронной почты:

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

Я бы ознакомился с руководством Проверка правильных записей и обратные вызовы ;он предоставляет исчерпывающую информацию о многих функциях, которые Active Record предоставляет в плане проверки.Вы также можете ознакомиться с документацией здесь .

5 голосов
/ 21 марта 2012

Если вы используете любую из встроенных проверок (присутствие, length_of), вы можете применить одну проверку к нескольким атрибутам, например:

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

см .: http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3/

3 голосов
/ 04 декабря 2014

В Rails 4 вы можете применить одну и ту же проверку к нескольким столбцам с помощью цикла:

[:beds, :baths].each do |column|
  validates column, allow_blank: true, length: { maximum: 25 }
end

Обе кровати и ванны проверяются с использованием одинаковых проверок.

Edit:

В Rails 4.2 вы можете сделать то же самое, поместив несколько символов после вызова функции validates. Пример:

validates :beds, :baths, allow_blank: true
1 голос
/ 20 августа 2013

Используйте Фемида для этого:

# 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
0 голосов
/ 14 октября 2018

Или вы можете использовать «with_options», например:

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