これで、アプリケーション内で新製品のスプレッドシートファイルをアップロードできる機能を構築しようとしています。私は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
私のテストの目的のために、私は1枚しか持っていません。私はこれを追加しようとしたが、私はまだ同じ結果を得た。 binding.pryを追加したところ、行変数が正しいことがわかりました。私は、正しいキー/値の組み合わせでカスタムハッシュを取得していました。しかし、なぜ私はproduct.attributesにこれらの値を代入しようとしているのか分かりませんが、それでも私は新しいProduct with -nil-valuesを残してしまいます。 –