ruby-on-railsrubyformscollections

Make blank params[] nil


When a user submits a form and leaves certain fields blank, they get saved as blank in the DB. I would like to iterate through the params[:user] collection (for example) and if a field is blank, set it to nil before updating attributes. I can't figure out how to do this though as the only way I know to iterate creates new objects:

coll = params[:user].each do |c|
    if c == ""
       c = nil
    end
end

Thanks.


Solution

  • Consider what you're doing here by using filters in the controller to affect how a model behaves when saved or updated. I think a much cleaner method would be a before_save call back in the model or an observer. This way, you're getting the same behavior no matter where the change originates from, whether its via a controller, the console or even when running batch processes.

    Example:

    class Customer < ActiveRecord::Base
      NULL_ATTRS = %w( middle_name )
      before_save :nil_if_blank
    
      protected
    
      def nil_if_blank
        NULL_ATTRS.each { |attr| self[attr] = nil if self[attr].blank? }
      end
    end
    

    This yields the expected behavior:

    >> c = Customer.new
    => #<Customer id: nil, first_name: nil, middle_name: nil, last_name: nil>
    >> c.first_name = "Matt"
    => "Matt"
    >> c.middle_name = "" # blank string here
    => ""
    >> c.last_name = "Haley"
    => "Haley"
    >> c.save
    => true
    >> c.middle_name.nil?
    => true
    >>