Hi,
I often find myself using bits of code like this inside ActiveRecord,
perhaps it''s useful for others, or others can improve on it:
###########
# fix user input before validating it
before_validation :sanitize_input
# santize input before actual validation is called
# this uses the little methods defined below
def sanitize_input
trim %w(adres postcode woonplaats email naam telefoon mobiel)
downcase :email
empty_to_nil %w(telefoon mobiel)
end
# pass in a list of fields whose values will be converted to nil
# you should only use these on objects that respond to empty?
# if the value is empty (this causes empty strings '''' to
become nils)
def empty_to_nil(fields)
fields.to_a.each {|f| self[f] = nil if self[f].empty? }
end
# pass in a list of fields whose values will be trimmed
def trim(fields)
fields.to_a.each {|f| self[f].strip! }
end
# pass in a list of fields of this object that will be lowercased
# useful for accepting only unique emails
def downcase(fields)
fields.to_a.each {|f| self[f].downcase! }
end
##########
HTH,
Jeroen
Hello Jeroen,> I often find myself using bits of code like this inside ActiveRecord, > perhaps it''s useful for others, or others can improve on it:thanks to share this with us.> ########### > > # fix user input before validating it > before_validation :sanitize_input > > # santize input before actual validation is called > # this uses the little methods defined below > def sanitize_input > trim %w(adres postcode woonplaats email naam telefoon mobiel) > downcase :email > empty_to_nil %w(telefoon mobiel) > end > > # pass in a list of fields whose values will be converted to nil > # you should only use these on objects that respond to empty? > # if the value is empty (this causes empty strings '''' to become nils) > def empty_to_nil(fields) > fields.to_a.each {|f| self[f] = nil if self[f].empty? } > endAnother way is to make it more *DSL*ish : def empty_to_nil(*fields) fields.each {|f| self[f] = nil if self[f].empty? } end and the same for trim and downcase (you get the idea). so that sanitize_input looks like that : def sanitize_input trim :adres, :postcode, :woonplaats, :email, :naam, :telefoon, :mobiel downcase :email empty_to_nil :telefoon, :mobiel end Regards, -- Jean-Fran?ois. -- ? la renverse.
Jean-Fran?ois wrote:> Hello Jeroen, > >> I often find myself using bits of code like this inside ActiveRecord, >> perhaps it''s useful for others, or others can improve on it: > > thanks to share this with us. >No problem :-)> > Another way is to make it more *DSL*ish : > > def empty_to_nil(*fields) > fields.each {|f| self[f] = nil if self[f].empty? } > end > > and the same for trim and downcase (you get the idea). > > so that sanitize_input looks like that : > > def sanitize_input > trim :adres, :postcode, :woonplaats, :email, :naam, :telefoon, :mobiel > downcase :email > empty_to_nil :telefoon, :mobiel > endCool, it does look a little more straightforward like that, thanks! Jeroen
On May 2, 2006, at 7:27 AM, Jeroen Houben wrote: [...]> downcase :email[...]> # pass in a list of fields of this object that will be lowercased > # useful for accepting only unique emails > def downcase(fields) > fields.to_a.each {|f| self[f].downcase! } > endNote that this is not safe to do in general: the local-part of an email address must be treated as case sensitive [RFC 2821]. Although it might not hurt you in practice, you risk interoperability with systems that don''t ignore the case of mailbox names. -- Rob Leslie rob@mars.org
Jeroen Houben wrote:> Hi, > > I often find myself using bits of code like this inside ActiveRecord, > perhaps it''s useful for others, or others can improve on it: > > ########### > > # fix user input before validating it > before_validation :sanitize_input > > # santize input before actual validation is called > # this uses the little methods defined below > def sanitize_input > trim %w(adres postcode woonplaats email naam telefoon mobiel) > downcase :email > empty_to_nil %w(telefoon mobiel) > end > > # pass in a list of fields whose values will be converted to nil > # you should only use these on objects that respond to empty? > # if the value is empty (this causes empty strings '''' to become nils) > def empty_to_nil(fields) > fields.to_a.each {|f| self[f] = nil if self[f].empty? } > end > > # pass in a list of fields whose values will be trimmed > def trim(fields) > fields.to_a.each {|f| self[f].strip! } > end > > # pass in a list of fields of this object that will be lowercased > # useful for accepting only unique emails > def downcase(fields) > fields.to_a.each {|f| self[f].downcase! } > end > ##########Slightly improved version: before_validation :sanitize_input private # santize input before actual validation is called def sanitize_input strip :address, :postcode, email, :phone downcase :email empty_to_nil :phone end # pass in the fields whose values will be converted to nil # if the value is empty (this causes empty form elements to become nils) # you should only use these on objects that respond to empty? (it''s really only meant for strings) def empty_to_nil(*fields) fields.each {|f| self[f] = nil if self[f].empty? unless self[f].nil? } end # pass in a list of fields whose values will be trimmed def strip(*fields) fields.each {|f| self[f].strip! unless self[f].nil? } end # pass in a list of fields of this object that will be lowercased # useful for accepting only unique emails def downcase(*fields) fields.each {|f| self[f].downcase! unless self[f].nil? } end HTH, Jeroen