ruby-on-railsroo

undefined method `fetch_value' for nil:NilClass when using Roo


I am trying to use Roo to import data from an Excel spreadsheet into a table (data_points) in a Rails app.

I am getting the error:

undefined method `fetch_value' for nil:NilClass

and that error references my data_point.rb file at line (see below for full code excerpt):

data_point.save!

The "Application Trace" says:

app/models/data_point.rb:29:in `block in import'
app/models/data_point.rb:19:in `import'
app/controllers/data_points_controller.rb:65:in `import'

I am puzzled by this because a "find all" in my entire app shows no instance of fetch_value

Here is the other code in my app:

In my model, data_point.rb:

class DataPoint < ActiveRecord::Base
attr_accessor :annual_income, :income_percentile, :years_education

def initialize(annual_income, income_percentile, years_education)
    @annual_income = annual_income
    @income_percentile = income_percentile
    @years_education = years_education
end

def self.import(file)
    spreadsheet = open_spreadsheet(file)
    header = spreadsheet.row(1)
    (2..11).each do |i| 
        annual_income = spreadsheet.cell(i, 'A')
        income_percentile = spreadsheet.cell(i, 'B')
        years_education = spreadsheet.cell(i, 'C')
        data_point = DataPoint.new(annual_income, income_percentile, years_education)
        data_point.save!
    end
end 

def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
    when ".xlsx" then Roo::Excelx.new(file.path)
    else raise "Unknown file type: #{file.original_filename}"
    end
end
end

In my controller, data_points_controller.rb I have added, in addition to the standard rails framework:

def import
    DataPoint.import(params[:file])
    redirect_to root_url, notice: "Data points imported."
end

In the Excel file I'm using, the header row has column names that are exactly the same as the 3 attributes noted above for DataPoints: annual_income, income_percentile, years_education

P.s. I have already watched RailsCast 396: Importing CSV and Excel, and read the comments many times. I think I am struggling with translating the example code to Rails 4 and / or my assignment of individual attributes (vs. the approach used in the RailsCast).

Thanks in advance for any help!


Solution

  • It seems you had some leftovers from your non rails practice, as we found in the comments. Notably, the overwritten initialize method, and the attr_accessor for each of the attributes. Removing them (and fixing the DataPoint.new() for the correct format) was all that was needed.