2010-02-28 2 views
0

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 :(

+0

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

Répondre

1

Vous devez définir la tokenizer comme méthode, à savoir

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

maintenant, utilisez ce symbole de la méthode que la valeur de l'attribut :tokenizer

validates_length_of :description, 
    :minimum => 2, :on => :save, 
    :message => "must be at least 2 words", 
    :tokenizer => :foo 
+0

Merci - malheureusement je reçois maintenant quand je lance le fichier spec pour le modèle: NoMethodError dans 'GbgSymbols devraient avoir une description d'au moins 2 mots de méthode non définie'appel » pour: tokenize_by_words: Symbole qui est la même comme si je n'avais pas défini le tokenizer du tout! Le répertoire config/initializers est le bon endroit pour la définition, n'est-ce pas? –

+0

Ça devrait marcher. J'ai vérifié cela. Pouvez-vous essayer de mettre la méthode dans l'un des modèles (au lieu de ActiveRecord :: Base) et voir si cela fonctionne. Si c'est le cas, il peut y avoir un problème dans la façon dont vous ajoutez cette méthode à la classe ActiveRecord :: Base. Lisez ce sujet pour obtenir des informations sur l'extension d'ActiveRecord: http://stackoverflow.com/questions/2328984/rails-extending-activerecordbase –

+0

Il a fallu du temps pour y revenir! J'ai marqué votre réponse comme acceptée, mais j'ai toujours la même erreur, même en mettant la méthode directement dans le modèle. Le fil que vous avez lié n'a pas aidé, car il montre juste que je faisais déjà la bonne chose. (Puisque Rails est tout à propos de la convention sur la configuration, vous penseriez qu'il y aurait un tokenizers.rb quelque part, n'est-ce pas? :) –

Questions connexes