ruby-on-rails-4roo-gem

Getting uninitialized constant Student::Roo error while importing csv file in rails


I have an application on which I want to provide the feature to import the records from CSV and Excel file formats. I am using roo gem for it, but at the time of importing it gives the error "uninitialized constant Student::Roo".

Here is the code :

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 %>   

Gemfile :

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 : This is the test data for student.

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

Solution

  • First, after @SKV comment: the correct name for CSV class is Roo::CSV and not Roo::Csv.

    If the error persists, then it means that any of the Roo classes (Roo::CSV, Roo::Excel, etc) is not defined at this point in Student class. This probably means that, while you probably added the roo gem to your Gemfile and bundled, you need to require roo wherever you want to use the gem. This is mentioned in the gem docs.

    Add require 'roo' to the top of student.rb file and it should work fine:

    # student.rb
    require 'roo'  # <==== 
    
    class Student < ActiveRecord::Base
      def self.open_spreadsheet(file)
        ...
      end
    end