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

岁酱吖の 提交于 2019-11-27 07:58:59

问题


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!


回答1:


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.




回答2:


I ran into a similar error also when trying to use Active Record with a legacy database. The problem for me was related to the fact that one of the columns of my database was named 'class,' which caused all sorts of things to fail. I renamed the column in the legacy database and everything worked fine.

Moral of the story- check the column names for any reserved words.




回答3:


This is the problem encountered yesterday, the reason is I defined a Database field with name class, which is a reserved word for the Ruby language. It caused the conflict.




回答4:


Remove your def initialize() method



来源:https://stackoverflow.com/questions/30602250/undefined-method-fetch-value-for-nilnilclass-when-using-roo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!