NoMethodError... but its not a method!

Hi everyone, I am putting together an application in which each part of it was tested individually. Now that it is put together, I'm having problems... The one giving me problems is my "ImportController" which parses a CSV during post and puts it into my database. I have two separate CSV upload actions (one is for a bill called "bes" and the other from the provider "prov"). The one for BES works fine. Prov worked perfectly fine before, but now it gives me this error:

undefined method `prov_charges_tot=' for #<Prov:0x4674734>

The thing is, thats not even supposed to be a method! The relevant part of the view looks like this:

<% form_for :dump, :url => { :controller => 'import', :action => 'bes' }, :html => { :multipart => true } do |f| -%> <label for="dump_file">Select a BES CSV File :</label>      <%= f.file_field :file -%>      <%= submit_tag 'Submit' -%> <% end -%>

<% form_for :dump, :url => { :controller => 'import', :action => 'prov' }, :html => { :multipart => true } do |f| -%> <label for="dump_file">Select a Provider CSV File :</label>      <%= f.file_field :file -%>      <%= submit_tag 'Submit' -%> <% end -%>

Perhaps it is a naming problem? I am not sure. My controller looks like this:

def bes @currenttime = @parsed_file = FasterCSV::parse(params[:dump][:file]) @parsed_file.shift n=0 @parsed_file.each do |row|   c.bes_id=row[0]      # There are a bunch more of these lines, but this part works.   c.bes_handheldconfigid=row[21]    @besnumber = params[:bes]

  if   n=n+1   GC.start if n%50==0   end   Bes.delete_all(["created_at < ?", @currenttime])[:message] = 'CSV BES Import Successful'   end   end

def prov      @currenttime =      @parsed_file = FasterCSV::parse(params[:dump][:file])      @parsed_file.shift      n=0      @parsed_file.each do |row|   c.prov_info_fac=row[0]   c.prov_info_bac=row[3]   c.prov_info_cycle_end_date=row[5]

  c.prov_service_name=row[1]   c.prov_service_number=row[2]   c.prov_service_provider=row[4]

  c.prov_charges_tot=row[43] # THIS IS WHERE THE ERROR OCCURS   c.prov_charges_tot_access=row[6]   c.prov_charges_tot_airtime=row[7]   c.prov_charges_tot_kb=row[8]   c.prov_charges_tot_messaging=row[9]   c.prov_charges_tot_features=row[12]   c.prov_charges_tot_equipment=row[25]   c.prov_charges_tot_longdistance=row[26]   c.prov_charges_tot_roaming=row[30]   c.prov_charges_tot_misc=row[38]   c.prov_charges_tot_other=row[41]   c.prov_charges_tot_taxesfees=row[42]

  c.prov_charges_messaging_sms=row[10]   c.prov_charges_messaging_mms=row[12]   c.prov_charges_feat_basicvoice=row[14]   c.prov_charges_feat_voicemail=row[15]   c.prov_charges_feat_wos=row[16]   c.prov_charges_feat_aod=row[17]   c.prov_charges_feat_intnl=row[18]   c.prov_charges_feat_mou=row[19]   c.prov_charges_feat_data=row[20]   c.prov_charges_feat_vidshare=row[21]   c.prov_charges_feat_wifi=row[22]   c.prov_charges_feat_messaging=row[23]   c.prov_charges_feat_otherfees=row[24]   c.prov_charges_feat_otherfeat=row[25]   c.prov_charges_ld_local=row[28]   c.prov_charges_ld_intnl=row[29]   c.prov_charges_ld_directory=row[30]   c.prov_charges_roam_airtime=row[32]   c.prov_charges_roam_kb=row[33]   c.prov_charges_roam_surcharges=row[34]   c.prov_charges_roam_ld=row[35]   c.prov_charges_roam_intnl=row[36]   c.prov_charges_roam_intnl_ld=row[37]   c.prov_charges_roam_taxes=row[38]   c.prov_charges_misc_voice=row[40]   c.prov_charges_misc_data=row[41]

     if         n=n+1         GC.start if n%50==0         end

     Prov.delete_all(["created_at < ?", @currenttime])[:message] = 'CSV Import Successful'

   end    end

My models are just empty, so nothing to worry about there. I am really having a frustrating time with this one... I think it would be a naming thing, but I really don't know.

Any help is greatly appreciated! Thank you all very much! - Jeff Miller

I got it, I forgot I added that column after I migrated the database... thus, there was no prov_charges_tot column... stupid me...

Thanks anyway! - Jeff


That's a lot of very repetitive code in your prov method. You could use a hash and really clean that up (and possibly make it easier to maintain).

At the top of the method (or maybe as a constant on the Prov class?) add something like this: prov_map = {:prov_info_fac => 0, :prov_info_bac =>3, :prov_info_cycle_end_date=>5, ... }

then your processing loop looks like:

... @parsed_file.each do |row|   prov_map.each{|attr, column| c.send "#{att}r=", row[column] } end ...