我知道如何通过在模型中使用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是访问允许的属性的方式吗?
这是我在这里的第一个问题,而且我相当缺乏经验,我希望我已经包括了所有需要的东西。提前谢谢你
发布于 2019-10-21 21:07:27
foreach
方法将允许您迭代有问题的csv文件。是的,params[:file]
允许您访问该文件(如果该文件来自表单,则应该是控制器上的一个允许参数)。根据示例,Model
类中的对象将具有属性- name
、age
、gender
。Model.create
将使用提供的参数创建一个对象,并将其写入底层数据库。row
在这里是一个迭代变量。row
将遍历csv文件的所有行。仅当提供headers: true
时(如此处所示),才会读取头文件。
发布于 2019-10-23 23:41:22
因此,在尝试了一些之后,我为那些感兴趣的人找到了一个解决方案,它可能不是最干净的,但它似乎对我很有效。"Testfilemodel“是我保存内容的另一个模型。我认为"filename“是可以删除的。
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“模型中,我只有基本的index和show方法来显示内容。如果其他人也有同样的问题,希望这对你有所帮助。
https://stackoverflow.com/questions/58475376
复制相似问题