My model object's attributes are not being saved

Hello all, I'm into my first week of rails coding and I'm really enjoying it so far. I've run into a bit of an problem. I have a user model which represents the currently logged in user. I'm also creating a gas_reading model which will be a child of the user model. When I attempt to create and save a new gas_reading its saving successfully without any exceptions but its not storing the attributes. I'm logging the values directly before the save call in the create method of my controller and they're set correctly but I can see from the mongrel output that the sql being used does not contain any values.

I've been searching for a similar problem on here and haven't managed to find anything and I've tried hacking around as much as possible but not been able to make progress.

Any help would be really appreciated.

Here's my code:

user.rb:

class User < ActiveRecord::Base      has_many :gas_readings    ... lots of stuff around passwords and encryption

end

gas_reading.rb:

class GasReading < ActiveRecord::Base   validates_presence_of :value, :start_date, :end_date      belongs_to :user   attr_accessor :value, :start_date, :end_date end

gas_reading_controller.rb: # GET /gas_readings/new   # GET /gas_readings/new.xml   def new     @user = User.find(Integer(session[:user_id]))     @gas_reading = @user.gas_readings.build   end

  # POST /gas_readings   # POST /gas_readings.xml   def create          logger.error "this is gas reading before #{params[:gas_reading]}"          @user = User.find(Integer(session[:user_id]))     @gas_reading = @user.gas_readings.build(params[:gas_reading])          logger.error "this is gas reading after #{@gas_reading.value} , #{@gas_reading.start_date} , #{@gas_reading.end_date}"          respond_to do |format|       if @gas_reading.save         flash[:notice] = 'GasReading was successfully created.'         format.html { redirect_to(@gas_reading) }       else         format.html { render :action => "new" }       end     end   end

This is the mongrel output when I create a new gas_reading: Rendering gas_readings/new Completed in 39ms (View: 11, DB: 7) | 200 OK [http://localhost/gas_readings/new\]   SQL (0.1ms) SET NAMES 'utf8'   SQL (0.1ms) SET SQL_AUTO_IS_NULL=0

Processing GasReadingsController#create (for 127.0.0.1 at 2010-03-29 16:41:41) [POST]   Parameters: {"commit"=>"Create", "authenticity_token"=>"RSLUS1/MA86MXtnm2RnBIh9ksD4FAzSX2NBnu80eh8s=", "gas_reading"=>{"end_date"=>"03/26/2010", "start_date"=>"03/02/2010", "value"=>"23423"}}   User Columns (1.9ms) SHOW FIELDS FROM `users`   User Load (1.0ms) SELECT * FROM `users` WHERE (`users`.`id` = 4) LIMIT 1 this is gas reading before start_date03/02/2010end_date03/26/2010value23423   User Load (0.3ms) SELECT * FROM `users` WHERE (`users`.`id` = 4)   GasReading Columns (2.2ms) SHOW FIELDS FROM `gas_readings` this is gas reading after 23423 , 03/02/2010 , 03/26/2010   SQL (0.7ms) BEGIN   GasReading Create (0.3ms) INSERT INTO `gas_readings` (`start_date`, `end_date`, `updated_at`, `user_id`, `created_at`) VALUES(NULL, NULL, '2010-03-29 15:41:41', 4, '2010-03-29 15:41:41')   SQL (26.2ms) COMMIT Redirected to http://localhost:3000/gas_readings/9 Completed in 62ms (DB: 33) | 302 Found [http://localhost/gas_readings\]

Hello all, I'm into my first week of rails coding and I'm really enjoying it so far.

Welcome!

I've run into a bit of an problem. I have a user model which represents the currently logged in user. I'm also creating a gas_reading model which will be a child of the user model. When I attempt to create and save a new gas_reading its saving successfully without any exceptions but its not storing the attributes.

That's because you're not letting ActiveRecord see those attributes. Take out this line:

attr_accessor :value, :start_date, :end_date

You should already have these columns in your table from your migration. attr_accessor is when you want your object to temporarily keep track of data that is *not* stored in your table.

Hope this helps,

Jeff

purpleworkshops.com

Ah thanks for your reply. I didn't fully understand how active records build attribute accessors based on table names for you. Also turns out I had named one of my columns value and it wasn't being added by the migration.