рельсы 3 проверки строки - PullRequest
       4

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

13 голосов
/ 08 февраля 2011

Hiho

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

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

validates :string, :not => 'something'

спасибо Klump

Ответы [ 2 ]

22 голосов
/ 08 февраля 2011

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

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

    <a href="http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_exclusion_of" rel="noreferrer">validates_exclusion_of</a> :string, :in => %w[something]
    
  2. Преимущество использования регулярного выражения, что упрощает обобщение:

    <a href="http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_format_of" rel="noreferrer">validates_format_of</a> :string, :without => /\A(something)\Z/
    

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

  3. Это общий случай, в котором вы можете добиться любой проверки:

    <a href="http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validate" rel="noreferrer">validate</a> :cant_be_something
    def cant_be_something
      <a href="http://apidock.com/rails/v3.0.0/ActiveModel/Errors/add" rel="noreferrer">errors.add</a>(:string, "can't be something") if self.string == "something"
    end
    
  4. Чтобы получить именно тот синтаксис, который вы предложили (validates :string, :not => "something"), вы можете использовать этокод (предупреждение, однако, я обнаружил это, читая ветку master исходного кода rails, и она должна работать, , но она не работает в моей ~ 3-месячной установке ).Добавьте это где-нибудь на своем пути:

    class NotValidator < <a href="http://apidock.com/rails/ActiveModel/EachValidator" rel="noreferrer">ActiveModel::EachValidator</a>
      def <a href="http://apidock.com/rails/ActiveModel/EachValidator/validate_each" rel="noreferrer">validate_each</a>(record, attribute, value)
        record.errors[attribute] << "must not be #{options{:with}}" if value == options[:with]
      end
    end
    
8 голосов
/ 08 февраля 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...