简体   繁体   中英

Importing excel files into rails using RubyXL

I'm trying to build a simple excel importer using RubyXL in rails to display barcode numbers. What i want to do is import am excel file and display the barcode results on an index page. I'm running into a couple errors and I'm not sure what exactly I'm missing. Here's what I have:

Controller:

class BarcodesController < ApplicationController
    
    def index
        @barcodes = Barcode.all
    end

    def show
        @barcode = Barcode.find(params[:id])
    end
    
    def  import
        Barcode.import(params[:file])
        redirect_to @barcode, notice: "Barcode imported"
    end
end

Model:

class Barcode < ActiveRecord::Base

    def self.import(file)
        workbook = RubyXL::Parser.parse(params[:file].path)
        worksheets = workbook.worksheets
        puts "Found #{worksheets.count} worksheets"

        worksheets.each do |worksheet|
            puts "Reading: #{worksheet.sheet_name}"
            num_rows = 0
            worksheet.each do |row|
                row_cells = row.cells.map{ |cell| cell.value }
                num_rows += 1
            end
            puts "Read #{num_rows} rows"
        end
    end
end

View:

<h2>Import Barcodes</h2>

<%= form_tag import_barcodes_path do %>
    <%= file_field_tag :file %>
    <%= submit_tag "Import" %>
<% end %>

Routes:

Rails.application.routes.draw do
  resources :users

  resources :barcodes do
    collection { post :import }
  end

  root to: "pages#root"
end

Here's the error message:

NameError in BarcodesController#import
undefined local variable or method `params' for Barcode(Table doesn't exist):Class
Extracted source (around line #4):
2
3
4
5
6
7
              

    def self.import(file)
        workbook = RubyXL::Parser.parse(params[:file].path)
        worksheets = workbook.worksheets
        puts "Found #{worksheets.count} worksheets"

Thank you for any feedback!

undefined local variable or method `params'

This is because it is looking for params local variable but it does not exist within Barcode.import method.

It's super simple. Pass the params from your controller to the import method of the Barcode model.

  1. Change 1

Change the method from def self.import(file) to def self.import(params)

  1. Change 2

In controller, change Barcode.import(params[:file]) to Barcode.import(params)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM