2011-05-16 4 views
2

J'essaie d'écrire un validateur personnalisé qui vérifiera le nombre de mots entrés dans un champ de texte.Écrire un validateur personnalisé dans Rails 3

je tentais de suivre l'exemple dans Railscasts épisode 211-http://railscasts.com/episodes/211-validations-in-rails-3

Je fait une /lib/word_limit_validator.rb de fichier et copiés dans le même code du tutoriel. Je sais que ce code ne compte pas le nombre de mots, j'essaie juste de l'utiliser car je sais comment il est censé se comporter.

class WordLimitValidator < ActiveModel::EachValidator 
    def validate_each(object, attribute, value) 
    unless value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 
     object.errors[attribute] << (options[:message] || "is not formatted properly") 
    end 
    end 
end 

Voici la ligne je dans ma validation:

validates :body, :presence => true, 
        :word_limit => true 

Lorsque j'ai essayé de charger la forme que je suis l'erreur suivante:

Unknown validator: 'word_limit'

Comment puis-je obtenir des rails à reconnaître mon validateur?

spécifications du système: Mac OS 10.6.7 Rails 3.0.4 rubis 1.9.2p136

Répondre

1

fichiers dans lib/ne sont pas plus dans Rails automatiquement chargé. Donc, vous avez quelques options.

  • Vous pouvez ajouter lib à vos chemins autoload dans votre application.rb:
    config.autoload_paths += %W(#{config.root}/lib)
  • Vous pouvez inclure par fichier en ajoutant quelque chose comme ça à config/initializers: require File.join(Rails.root, 'lib', 'word_limit_validator')
  • Si vous avez seulement besoin C'est un endroit, vous pouvez simplement le mettre dans le même fichier que votre modèle.
+0

J'ai utilisé la deuxième option et cela a fonctionné! – Cyrus

+0

Ouais, j'aurais dû dire - la deuxième option est OMI la meilleure option. Je ne suis pas sûr de ce qu'est la «meilleure pratique» de Rails 3. – muffinista

10

Vous pouvez aussi créer un répertoire app /validateurs dans votre projet rails et mettre vos validateurs personnalisés. De cette façon, ils seront automatiquement chargés.

+0

Cela fonctionne mais ... quand je change quelque chose dans 'app/validators/*. Rb' Rails (ou Spork) ne recharge pas le code. Une solution de contournement rapide consiste à ajouter une autre ligne 'watch' à' Guardfile'. –

Questions connexes