У меня есть следующая проверка в модели:
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: (*