如何使用CSV的标头作为请求标头在我的API中上传CSV文件的内容

时间:2019-10-20 17:13:53

标签: ruby-on-rails api csv

我知道如何通过使用模型中的has_one_attached将文件附加到我的请求上来上传文件。

但是我的目标是上传CSV文件的内容,而不是文件本身。 (csv文件也有一个我想使用的标头) 如何设置我的控制器和模型以启用此功能?

一些背景信息:我正在使用ETL流程来转换CSV文件,并想在我的API中上传这些CSV文件的内容。有很多大文件要上传,我想避免对文件进行手动更改。

尽管有一个小例子足以解决这个问题:

testfile1.csv

name;age;gender
max;23,m
lisa;12;f
gustavo;69;m
bernd;4;d

我看到了用于CSV文件的此方法,但是我不知道如何实现该方法

CSV.foreach(params[:file].path, headers: true) do |row|
  Model.create(name: row[0], age: row[1], gender: row[2])
end

“ Model.create”是否创建了一个新模型,所以我自己的模型不需要名称,年龄和性别,或者它如何工作? 我可以在服务中使用它吗? params [:file]是访问允许的属性的方法吗?

这是我的第一个问题,我经验不足,我希望我能包括所有需要的东西。预先谢谢你

2 个答案:

答案 0 :(得分:0)

foreach方法将使您可以迭代所涉及的csv文件。是的,params[:file]允许您访问文件(如果它来自表单,则应该是控制器上的允许参数)。根据示例,Model类中的对象将具有属性-nameagegenderModel.create将使用提供的参数创建一个对象,并将其写入基础数据库。 row是此处的迭代变量。 row将遍历csv文件的所有行。仅在提供headers: true时(如此处),才会读取标头。

答案 1 :(得分:0)

因此,在尝试了一下之后,我为感兴趣的人找到了解决方案,它可能不是最干净的,但似乎对我有用。 “ Testfilemodel”是我保存内容的其他模型。我认为“文件名”可以删除。

class Api::FileuploadsController < ApplicationController
    before_action :set_fileupload, only: [:show, :update, :destroy]
    require 'csv'
    def create
        @fileupload = csvmethod
    end

    private

    def file_params
        params.require(:fileupload).permit(:filename, :csvfile)
    end

    def csvmethod
        CSV.foreach(file_params[:csvfile].path, headers: true) do |row|
            Testfilemodel.create(name: row[0], age: row[1], gender: row[2])
        end
    end
    def set_fileupload
        @fileupload = Fileupload.find(params[:id])
    end
end

在“ Testfilemodel”模型中,我只有基本索引和显示方法来显示内容。 希望如果其他人也有同样的问题,这会有所帮助。