Как я могу использовать один и тот же токенизатор в разных моделях с validates_length_of? - PullRequest
1 голос
/ 28 февраля 2010

У меня есть следующая проверка в модели:

validates_length_of :description,
  :minimum => 2, :on => :save,
  :message => "must be at least 2 words",
  :tokenizer => lambda {|text| text.scan(/\w+/)}

И это прекрасно работает.Когда я добавляю в модель второе поле, которое необходимо проверить по количеству слов, я объявляю

tokenize_by_words = lambda {|text| text.scan(/\w+/)}

вверху модели и использую

:tokenizer => tokenize_by_words

Это такжеработает отлично, и держит все СУХОЙ.Тем не менее, все это разваливается, когда мне нужно использовать один и тот же токенизатор для нескольких моделей.Если я создаю config / initializers / tokenizers.rb таким образом:

class ActiveRecord::Base
  tokenize_by_words = lambda {|text| text.scan(/\w+/)}
end

и удаляю определения из моделей, я получаю /Library/Ruby/Gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1959:in 'method_missing': undefined local variable or method 'tokenize_by_words' for #<Class:0x10357e988> (NameError)

Используя переменную экземпляра или заменяя все это наметод тоже не работает.

Я уверен, что есть что-то ослепительно очевидное, что я упускаю, но единственная документация, которую я могу найти: tokenizer на самом деле не учитывает DRY-ness: (*

Ответы [ 2 ]

2 голосов
/ 28 февраля 2010

Вы должны определить токенизатор как метод, т.е.

class ActiveRecord::Base
  def foo(text)
    text.scan(/\w+/)
  end
end

Теперь используйте этот символ метода в качестве значения атрибута :tokenizer.

validates_length_of :description,
  :minimum => 2, :on => :save,
  :message => "must be at least 2 words",
  :tokenizer => :foo
1 голос
/ 25 февраля 2015

Вы сможете использовать: символ для токенизатора.
Пожалуйста, следите за обновлениями;)

class Article
  include ActiveModel::Model

  validates_length_of :content,
    :minimum => 10,
    :message => "must be at least 10 words",
    :tokenizer => :tokenize_by_words

  def tokenize_by_words(text)
    text.scan(/\w+/)
  end
end

Разрешить символ в качестве значений для tokenizer из LengthValidator от kakipo · Запрос на извлечение # 16381 · Рельсы / Рельсы

...