(english version)

Haciendo algunos ajustes a rubycorner.com me consigo con que necesito validar que un atributo de un modelo no cumpla con una expresión regular dada.

Mi primera alternativa fue definir un método validate en mi modelo, similar a:

RUBY:
  1. def validate
  2.   if my_field =~ /html|http|onclick|onmouseover/
  3.     errors.add("my_field", "should not contain html, http, onclick or onmouseover.")
  4.   end
  5. end

Sin embargo este enfoque no es muy DRY que digamos, asi que lo que hice fue crear un nuevo método llamado validates_unlike, el cual simplemente valida que el contenido de un campo no haga match con el RegExp suministrado (lo mismo que validates_format_of, pero con la condición negada), el código es:

RUBY:
  1. module ActiveRecord
  2.   module Validations
  3.     module ClassMethods
  4.       def validates_unlike(*attr_names)
  5.         configuration = { :message => ActiveRecord::Errors.default_error_messages[:invalid], :on => :save, :with => nil }
  6.         configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
  7.  
  8.         raise(ArgumentError, "A regular expression must be supplied as the :with option of the configuration hash") unless configuration[:with].is_a?(Regexp)
  9.  
  10.         validates_each(attr_names, configuration) do |record, attr_name, value|
  11.           record.errors.add(attr_name, configuration[:message]) if value.to_s =~ configuration[:with]
  12.         end
  13.       end
  14.     end   
  15.   end
  16. end

El código puedes descargarlo como un plugin rails: validates_unlike-0.1.zip


RSS feeds

Suscríbete a nuestros RSS Feeds