使用 Roo 时 nil:NilClass 的未定义方法 `fetch_value'
undefined method `fetch_value' for nil:NilClass when using Roo
我正在尝试使用 Roo 将数据从 Excel 电子表格导入 Rails 应用程序中的 table (data_points)。
我收到错误:
undefined method `fetch_value' for nil:NilClass
并且该错误在行中引用了我的 data_point.rb 文件(完整代码摘录见下文):
data_point.save!
"Application Trace" 说:
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'
我对此感到困惑,因为我的整个应用程序中的 "find all" 没有显示 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
在我的控制器中,data_points_controller.rb 除了标准 rails 框架外,我还添加了:
def import
DataPoint.import(params[:file])
redirect_to root_url, notice: "Data points imported."
end
在我使用的 Excel 文件中,header 行的列名与上面提到的数据点的 3 个属性完全相同:annual_income、income_percentile, years_education
P.s。我已经看了RailsCast 396: Importing CSV 和Excel,看了很多遍评论。我认为我正在努力将示例代码转换为 Rails 4 和/或我对单个属性的分配(与 RailsCast 中使用的方法相比)。
在此先感谢您的帮助!
您的非 rails 练习似乎有一些遗留问题,正如我们在评论中发现的那样。值得注意的是,覆盖的 initialize
方法和每个属性的 attr_accessor
。删除它们(并修复 DataPoint.new()
以获得正确的格式)就足够了。
我 运行 在尝试将 Active Record 与遗留数据库一起使用时也遇到了类似的错误。我的问题与我的数据库中的一个列被命名为 'class,' 导致各种事情失败有关。我重命名了旧数据库中的列,一切正常。
故事的寓意 - 检查列名是否有任何保留字。
这是昨天遇到的问题,原因是我定义了一个名为class
的数据库字段,这是Ruby语言的保留字。引起了冲突。
删除您的 def initialize()
方法
如果由于某种原因您不限制删除 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
的更多信息,请参见 here。
我正在尝试使用 Roo 将数据从 Excel 电子表格导入 Rails 应用程序中的 table (data_points)。
我收到错误:
undefined method `fetch_value' for nil:NilClass
并且该错误在行中引用了我的 data_point.rb 文件(完整代码摘录见下文):
data_point.save!
"Application Trace" 说:
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'
我对此感到困惑,因为我的整个应用程序中的 "find all" 没有显示 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
在我的控制器中,data_points_controller.rb 除了标准 rails 框架外,我还添加了:
def import
DataPoint.import(params[:file])
redirect_to root_url, notice: "Data points imported."
end
在我使用的 Excel 文件中,header 行的列名与上面提到的数据点的 3 个属性完全相同:annual_income、income_percentile, years_education
P.s。我已经看了RailsCast 396: Importing CSV 和Excel,看了很多遍评论。我认为我正在努力将示例代码转换为 Rails 4 和/或我对单个属性的分配(与 RailsCast 中使用的方法相比)。
在此先感谢您的帮助!
您的非 rails 练习似乎有一些遗留问题,正如我们在评论中发现的那样。值得注意的是,覆盖的 initialize
方法和每个属性的 attr_accessor
。删除它们(并修复 DataPoint.new()
以获得正确的格式)就足够了。
我 运行 在尝试将 Active Record 与遗留数据库一起使用时也遇到了类似的错误。我的问题与我的数据库中的一个列被命名为 'class,' 导致各种事情失败有关。我重命名了旧数据库中的列,一切正常。
故事的寓意 - 检查列名是否有任何保留字。
这是昨天遇到的问题,原因是我定义了一个名为class
的数据库字段,这是Ruby语言的保留字。引起了冲突。
删除您的 def initialize()
方法
如果由于某种原因您不限制删除 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
的更多信息,请参见 here。