2017-06-05 3 views
1

これで、アプリケーション内で新製品のスプレッドシートファイルをアップロードできる機能を構築しようとしています。私はRooの宝石をインストールしました。私は、ユーザーが製品にアプリケーションをアップロードするためのテンプレート付きGoogleスプレッドシートをダウンロードするためのリンクを作成しました。この機能をテストする目的で、このテンプレートシートを使用してアプリケーションにアップロードしています。roo-gemを使用してスプレッドシートを解析するときにRailsデータベースのActiveRecord属性の値を取得する

最初の行ヘッダーには、データベースに製品を作成するために必要な属性の名前があります。

ファイルをアップロードすることはできますが、ファイルに記載されている製品の数にかかわらず、という製品のみをアップロードします。また、インポートされる製品には、ファイルの属性に関連付けられた-nil-値があります。これをRailsコンソールで確認できます。例えば

: 名:nilに、説明:ゼロなど

これは私のProduct.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.accessible_attributes 
    ['name', 'description', 'category', 'barcode', 'quantity', 
    'capacity', 'threshold'] 
end 

def self.open_spreadsheet(file) 
    case File.extname(file.original_filename) 
    when ".csv" then Roo::Csv.new(file.path, file_warning: :ignore) 
    when ".xls" then Roo::Excel.new(file.path, file_warning: :ignore) 
    when ".xlsx" then Roo::Excelx.new(file.path, file_warning: :ignore) 
    else raise "Unknown file type: #{file.original_filename}" 
    end 
end 

これは私が私のルートを設定している方法です。

resources :products do 
    collection { post :import } 
end 

答えて

2

だから私が持っていた問題は、スプレッドシート上で私がインポートしたヘッダー行が大文字で小文字ではなかったということでした。また、Capacity、Threshold、およびQuantity属性に問題がありました。なぜなら、それらがProductモデルから離れていなかったからです。

スプレッドシートを編集してこれらの3つの属性を削除すると、エラーなしで正しくインポートされました。

0

注:1枚のスプレッドシートは複数のシートを持っているので、何がやりたいことは、この

です210
spreadsheet = open_spreadsheet(file) # this return a spreadsheet 
sheet1 = spreadsheet.sheet(0) # this will return the first sheet 
puts spreadsheet.sheets # show all sheets 
+1

私のテストの目的のために、私は1枚しか持っていません。私はこれを追加しようとしたが、私はまだ同じ結果を得た。 binding.pryを追加したところ、行変数が正しいことがわかりました。私は、正しいキー/値の組み合わせでカスタムハッシュを取得していました。しかし、なぜ私はproduct.attributesにこれらの値を代入しようとしているのか分かりませんが、それでも私は新しいProduct with -nil-valuesを残してしまいます。 –

関連する問題