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 つの属性 (annual_income、income_percentile、years_education) とまったく同じ列名があります。

追伸 RailsCast 396: Importing CSV and Excel を既に見て、コメントを何度も読みました。サンプル コードを Rails 4 に変換したり、個々の属性を割り当てたりするのに苦労していると思います (RailsCast で使用されているアプローチとは異なります)。

助けてくれてありがとう!

4

5 に答える 5

10

コメントで見つけたように、レール以外の練習の残り物がいくつかあったようです。特に、上書きされたinitializeメソッドとattr_accessorfor each 属性。それらを削除する (およびDataPoint.new()正しい形式に修正する) だけで十分でした。

于 2015-06-02T20:39:59.537 に答える