ruby-on-rails - Rails 控制器循环问题 - 更新存在的位置
问题描述
我有一个表单,人们可以通过上传带有 ID 的 csv 文件创建一个或多个卡片请求。我可以简单地创建请求。在这个例程中我还需要做两件事,我不知道该怎么做,并寻求建议。
1.) 我需要根据活动表检查文件上传或单个表单字段中的 id。如果他们不活跃,请提醒该人。
2.) 如果 empid 和 cardholdergroup 的组合已经存在,则使用通过的新参数更新该请求。
这是我的行动。关于我应该如何/在哪里做这些的任何想法?任何建议表示赞赏。
def create
if cardrequest_params[:file].present?
file_path = cardrequest_params[:file].path
@cardholdergroups = cardrequest_params[:cardholdergroup_ids].map do |cardholdergroup_id|
CSV.foreach(file_path) do |row|
@cardrequest = Cardrequest.create(empid: row[0], startdate: cardrequest_params[:startdate], enddate: cardrequest_params[:enddate], user_id: current_user.id, cardholdergroup_ids: cardholdergroup_id)
end
end
else
@cardholdergroups = cardrequest_params[:cardholdergroup_ids].map do |cardholdergroup_id|
@cardrequest = Cardrequest.create(empid: cardrequest_params[:empid], startdate: cardrequest_params[:startdate], enddate: cardrequest_params[:enddate], user_id: current_user.id, cardholdergroup_ids: cardholdergroup_id)
end
end
respond_to do |format|
if @cardrequest.save
format.html { redirect_to cardrequests_path, notice: "Cardrequest was successfully created." }
format.json { render :show, status: :created, location: @cardrequest }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @cardrequest.errors, status: :unprocessable_entity }
end
end
end
解决方案
好吧,有几种不同的方法可以解决这个问题。如果是我,我会将 CSV 解析完全从服务器端取出,并使用 JS 库 PapaParse 之类的东西来完成。让它一次将每个字段发送到您的创建函数。然后,您可以轻松地使用find_or_create_by函数或您需要的任何逻辑来响应 js 消息。
然后,当他们使用 csv 文件“上传”时,您可以轻松地显示每个 csv 行项目的表格,并保存/更新结果。
但是,如果您不是 javascript 大佬,我至少会将 CSV 上传与 create 函数分开,形成自己的形式。
# Cardrequest Controller
def csv_import
Cardrequest.import(params[:file])
end
给它做个路线...
然后通过将 CSV 解析逻辑放入模型中来进一步清理:
# Cardrequest Model
def self.import(file)
# import logic here
CSV.foreach(file, headers: true) do |row|
row_hash = row.to_hash
match = Cardrequest.find_or_create_by(unique: row_hash["unique"])
match.update(#the rest of your data)
end
end
希望这有助于为您指明正确的方向。
推荐阅读
- android - 如何清理所有 Flutter 和 Android Studio 工作区?
- c# - C# 无法查看 API 响应上的错误只是抛出一个异常来尝试/捕获
- javascript - 使用 selenium 进行数据抓取无法找到搜索结果
- c# - 构建 Caliburn.Micro,得到“uap10.0.16299 的指定语言目标丢失”
- ajax - 显示第二个依赖下拉列表而不重新加载页面
- actionscript-3 - 如何停止执行框架上的其余代码?AS3
- javascript - 在网站的不同 div 上滚动时使 Bootstrap4 导航栏改变颜色
- python - 按日期过滤日期时间索引
- python - 如何在 Python 和 C++ 之间持久化一个对象?
- python-3.x - 从用户输入中过滤一个数字并在程序中使用它