Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 817
chrishomer Avatar asked Jul 26 '09 01:07

chrishomer


2 Answers

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 >> 
like image 153
Matt Haley Avatar answered Oct 07 '22 16:10

Matt Haley


If you just want to kill the blanks, you can just do params.delete_if {|k,v| v.blank?}.

like image 27
Chuck Avatar answered Oct 07 '22 17:10

Chuck