title: Rails before_validation strip whitespace best practices
body: <p>I would like my User model to sanitize some input before before save. For now some simple whitespace stripping will do. 
  So to avoid people registering with "Harry " and pretend to be "Harry", for example.</p>
  
  <p>I assume it is a good idea to do this stripping before validation, so that the validates_uniqueness_of can avoid accidental duplicates.</p>
  
  <pre><code>class User &lt; ActiveRecord::Base
    has_many :open_ids
  
    validates_presence_of :name
    validates_presence_of :email
    validates_uniqueness_of :name
    validates_uniqueness_of :email
    validates_format_of :email, :with =&gt; /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
  
    before_validation :strip_whitespace, :only =&gt; [:name, :email, :nick]
  
    private
    def strip_whitespace(value)
      value.responds_to?('strip') ? value.strip : value
    end
  end
  </code></pre>
  
  <p>However, this code comes with an error ArgumentError: wrong number of arguments (0 for 1). I assumed the callback would be passed the values.</p>
  
  <p>Also: is this stripping actually a good idea? Or should I rather validate on space and tell the user that "Harry  " contains invalid spacess (I want to allow "Harry Potter" but not "Harry\s\sPotter").</p>
  
  <p>Edit: As pointed out in a comment, my code is wrong (which is why I was asking the question a.o.). Please make sure you read the accepted answer in addition to my question for the correct code and to avoid the same mistakes I made.</p>