首页 > 解决方案 > 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

标签: ruby-on-railsactiverecordruby-on-rails-6

解决方案


好吧,有几种不同的方法可以解决这个问题。如果是我,我会将 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

希望这有助于为您指明正确的方向。


推荐阅读