Рельсы 3 проверка строки

Hiho

Есть ли способ сказать рельсы, что моя строка не может быть "чем-то"?

Я ищу что-то вроде

validates :string, :not => 'something'

спасибо Klump

Ответ 1

Любой из них выполнит задание (щелкните по методам документации):

  • Вероятно, лучший и быстрый способ, легко расширяемый для других слов:

    validates_exclusion_of :string, :in => %w[something]
    
  • Это имеет преимущество использования регулярного выражения, поэтому вы можете легче обобщить:

    validates_format_of :string, :without => /\A(something)\Z/
    

    Вы можете перейти к другим словам с помощью /\A(something|somethingelse|somemore)\Z/

  • Это общий случай, с помощью которого вы можете выполнить любую проверку:

    validate :cant_be_something
    def cant_be_something
      errors.add(:string, "can't be something") if self.string == "something"
    end
    
  • Чтобы получить именно тот синтаксис, который вы предложили (validates :string, :not => "something"), вы можете использовать этот код (предупреждение, хотя, я обнаружил это при чтении главной ветки источника рельсов, и он должен работать, но он не работает работа над моей установкой ~ 3 месяца). Добавьте это где-то на свой путь:

    class NotValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        record.errors[attribute] << "must not be #{options{:with}}" if value == options[:with]
      end
    end
    

Ответ 2

Несколько способов. Если у вас есть точный список того, чего он не может:

validates_exclusion_of :string, :in => ["something", "something else"]

Если вы хотите убедиться, что он вообще не существует подстрокой:

validates_format_of :string, :with => /\A(?!something)\Z/

Если это сложнее и вы хотите скрыть беспорядочные детали:

validate :not_something

def not_something
  errors.add(:string, "Can't be something") if string =~ /something/
end