4

我正在尝试使用 Roo 将 Excel 电子表格中的数据导入 Rails 应用程序中的表 (data_points) 中。

我收到错误消息:

undefined method `fetch_value' for nil:NilClass

并且该错误在行引用了我的 data_point.rb 文件(完整代码摘录见下文):

data_point.save!

“应用程序跟踪”说:

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'

我对此感到困惑,因为我的整个应用程序中的“查找全部”没有显示 fetch_value 的实例

这是我的应用程序中的其他代码:

在我的模型中,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

在我的控制器中,除了标准的 rails 框架之外,我还添加了 data_points_controller.rb:

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

在我使用的 Excel 文件中,标题行的列名与上述 DataPoints 的 3 个属性完全相同:yearn_income、income_percentile、years_education

Ps 我已经看过 RailsCast 396: Importing CSV and Excel,看了很多遍的评论。我想我正在努力将示例代码转换为 Rails 4 和/或我对各个属性的分配(与 RailsCast 中使用的方法相比)。

提前感谢您的帮助!

4

5 回答 5

22

在尝试将 Active Record 与旧数据库一起使用时,我也遇到了类似的错误。对我来说,问题与我的数据库的一个列被命名为“类”这一事实有关,这导致各种事情都失败了。我重命名了旧数据库中的列,一切正常。

故事的道德 - 检查列名是否有保留字。

于 2016-12-15T22:37:50.883 回答
10

正如我们在评论中发现的那样,您的非 Rails 练习似乎有一些剩余。值得注意的是,覆盖的initialize方法和attr_accessor每个属性的 。只需删除它们(并修复DataPoint.new()正确的格式)即可。

于 2015-06-02T20:39:59.537 回答
7

这是昨天遇到的问题,原因是我定义了一个名为 name 的 Database 字段class,它是 Ruby 语言的保留字。它引起了冲突。

于 2017-02-15T06:43:15.990 回答
1

删除你的def initialize()方法

于 2019-04-02T20:42:32.637 回答
0

如果由于某种原因您不限制删除该initialize方法,而不是删除它,您可以尝试添加super如下调用:

def initialize(annual_income, income_percentile, years_education)
  super()

  @annual_income = annual_income
  @income_percentile = income_percentile
  @years_education = years_education
end

资料来源:

  • 更多信息super可以在这里找到。
于 2021-05-21T21:09:44.570 回答