在 rails 中导入 csv 文件时出现未初始化常量 Student::Roo 错误
Getting uninitialized constant Student::Roo error while importing csv file in rails
我有一个应用程序,我想在该应用程序上提供从 CSV 和 Excel 文件格式导入记录的功能。我为此使用 roo
gem,但在导入时出现错误 "uninitialized constant Student::Roo".
这是代码:
student.rb
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
product = find_by_id(row["id"]) || new
product.attributes = row.to_hash.slice(*accessible_attributes)
product.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::Csv.new(file.path, nil, :ignore)
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
student_controller.rb :
def import
Student.import(params[:file])
#puts @session[:current_organization_id].inspect
redirect_to students_path, notice: "Record imported Successfully."
end
new.html.erb :
<%= form_tag import_students_path, multipart: true do %>
<%= file_field_tag :file , :required=> true%> <br/>
<%= submit_tag "Import" , :class => "btn btn-primary btn-block" %>
<% end %>
宝石文件:
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'mysql2'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'sass', '3.2.19'
gem 'bower-rails'
gem 'font-awesome-sass'
gem 'devise'
gem 'roo'
group :development, :test do
gem "rspec-rails", "~> 2.0"
gem "factory_girl_rails", "~> 4.0"
gem "capybara"
gem "database_cleaner"
gem "selenium-webdriver"
end
student.csv : 这是学生的测试数据。
enrollment_no,roll_no,address,father_name
11,21,test,test
17,21,test,test
18,21,test,test
19,21,test,test
20,21,test,test
22,21,test,test
23,21,test,test
24,21,test,test
首先,@SKV 评论后:CSV class 的正确名称是 Roo::CSV
而不是 Roo::Csv
.
如果错误仍然存在,则意味着 Roo
class 中的任何一个(Roo::CSV
、Roo::Excel
等)在此时未定义Student
class。这可能意味着,虽然您可能将 roo
gem 添加到您的 Gemfile
并捆绑,但您需要 require roo
在任何您想要使用 gem 的地方。 gem docs.
中提到了这一点
将 require 'roo'
添加到 student.rb
文件的顶部,它应该可以正常工作:
# student.rb
require 'roo' # <====
class Student < ActiveRecord::Base
def self.open_spreadsheet(file)
...
end
end
不是 Roo::Csv,是 Roo::CSV。所以代码应该像
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::CSV.new(file.path, nil, :ignore)
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
顺便说一句,不需要做 require 'roo'
我有一个应用程序,我想在该应用程序上提供从 CSV 和 Excel 文件格式导入记录的功能。我为此使用 roo
gem,但在导入时出现错误 "uninitialized constant Student::Roo".
这是代码:
student.rb
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
product = find_by_id(row["id"]) || new
product.attributes = row.to_hash.slice(*accessible_attributes)
product.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::Csv.new(file.path, nil, :ignore)
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
student_controller.rb :
def import
Student.import(params[:file])
#puts @session[:current_organization_id].inspect
redirect_to students_path, notice: "Record imported Successfully."
end
new.html.erb :
<%= form_tag import_students_path, multipart: true do %>
<%= file_field_tag :file , :required=> true%> <br/>
<%= submit_tag "Import" , :class => "btn btn-primary btn-block" %>
<% end %>
宝石文件:
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'mysql2'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'sass', '3.2.19'
gem 'bower-rails'
gem 'font-awesome-sass'
gem 'devise'
gem 'roo'
group :development, :test do
gem "rspec-rails", "~> 2.0"
gem "factory_girl_rails", "~> 4.0"
gem "capybara"
gem "database_cleaner"
gem "selenium-webdriver"
end
student.csv : 这是学生的测试数据。
enrollment_no,roll_no,address,father_name
11,21,test,test
17,21,test,test
18,21,test,test
19,21,test,test
20,21,test,test
22,21,test,test
23,21,test,test
24,21,test,test
首先,@SKV 评论后:CSV class 的正确名称是 Roo::CSV
而不是 Roo::Csv
.
如果错误仍然存在,则意味着 Roo
class 中的任何一个(Roo::CSV
、Roo::Excel
等)在此时未定义Student
class。这可能意味着,虽然您可能将 roo
gem 添加到您的 Gemfile
并捆绑,但您需要 require roo
在任何您想要使用 gem 的地方。 gem docs.
将 require 'roo'
添加到 student.rb
文件的顶部,它应该可以正常工作:
# student.rb
require 'roo' # <====
class Student < ActiveRecord::Base
def self.open_spreadsheet(file)
...
end
end
不是 Roo::Csv,是 Roo::CSV。所以代码应该像
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::CSV.new(file.path, nil, :ignore)
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
顺便说一句,不需要做 require 'roo'