J'ai la validation suivante dans un modèle:Comment utiliser le même tokenizer sur tous les modèles avec validates_length_of?
validates_length_of :description,
:minimum => 2, :on => :save,
:message => "must be at least 2 words",
:tokenizer => lambda {|text| text.scan(/\w+/)}
Et cela fonctionne très bien. Lorsque j'ajoute un second champ au modèle qui doit être validé par le nombre de mots, je déclare
tokenize_by_words = lambda {|text| text.scan(/\w+/)}
en haut du modèle, et utiliser
:tokenizer => tokenize_by_words
Cela fonctionne aussi bien, et garde tout DRY. Cependant, tout se décompose lorsque j'ai besoin d'utiliser le même tokenizer sur plusieurs modèles. Si je crée config/initializers/tokenizers.rb ainsi:
class ActiveRecord::Base
tokenize_by_words = lambda {|text| text.scan(/\w+/)}
end
et supprimer les définitions dans les modèles, je reçois /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)
En utilisant une variable d'instance ou de remplacer le tout par une méthode ne fonctionne pas non plus.
Je suis sûr qu'il ya quelque chose crève les yeux que je suis absent, mais la seule documentation que je peux trouver sur: tokenizer ne considère pas vraiment DRY-ness :(
Mon Ruby est un peu rouillé, mais sur la base du message d'erreur: si vous mettez classe '<< self' /' 'end' autour des tokenize_by_words = ... 'ligne? – Ken