【问题标题】:#396 Importing CSV and Excel Couldn't find Employee without an ID#396 导入 CSV 和 Excel 找不到没有 ID 的员工
【发布时间】:2014-05-17 02:53:51
【问题描述】:

我正在使用 rails 4。我遵循 Railscast 教程并选择了文件,但是当我导入时,我在 /employees/import 处收到此错误 ActiveRecord::RecordNotFound 找不到没有 ID 的员工

宝石袋

路由文件

 resources :employees do
      collection { post :import }
      end

型号

    class Employee < ActiveRecord::Base

def self.import(file)
   allowed_attributes = ["identifier","first_name","last_name","address","phone"]
  spreadsheet = open_spreadsheet(file)
  header = spreadsheet.row(1)
  (2..spreadsheet.last_row).each do |i|
    row = Hash[[header, spreadsheet.row(i)].transpose]
    employee = Employee.where(id: employee_hash["id"]) || new
    employee.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k }
    employee.save!

  if employee.count == 1
        employee.first.update_attributes(employee_hash)
      else
        Employee.create!(employee_hash)
      end # end if !product.nil?

  end # end self.import(file)
end # end class

def self.open_spreadsheet(file)
  case File.extname(file.original_filename)
  when ".csv" then Roo::Csv.new(file.path, :ignore)
  when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
  when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
  else raise "Unknown file type: #{file.original_filename}"
  end

end

end

员工控制器

class EmployeesController < ApplicationController
  before_action :set_employee, only: [:show, :edit, :update, :destroy, :import]

  # GET /employees
  # GET /employees.json
  def index
  @employee = Employee.where(:status => true)
  @turnover_employee = Employee.where(:status => false)
   respond_to do |format|
    format.html
    format.csv { send_data @employee.to_csv}
    format.xls #{ send_data @employee.to_csv(col_sep: "\t") } /// Alternativa ///

   end
  end


  def import
  Product.import(params[:file,:id])
  redirect_to root_url, notice: "Products imported."
end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_employee
      @employee = Employee.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def employee_params
      params.require(:employee).permit(:identifier, :first_name, :last_name, :address, :phone, :status, :service_company_id)
    end
end

进口索引表

<%= form_tag import_employees_path, multipart: true do %>
  <%= file_field_tag :file, :class=> "btn  icon-upload"  %> |
  <%= submit_tag "Importar", :class=> "btn  icon-upload" %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby excel csv


    【解决方案1】:

    看起来像在你的模型的导入类方法中:

    employee = Employee.where(id: employee_hash["id"]) || new
    

    employee_hash["id"] 中找不到值。所以你实际上是在做Employee.where(id: nil)

    我看不到将employee_hash 设置为任何值的任何地方。

    【讨论】:

    • 让它为 csv 工作了,我会发布代码更新,看看我是否可以就该代码获得一些帮助。谢谢你这么快回复
    【解决方案2】:

    我使用此代码让它工作:

    def self.import(file)
      allowed_attributes = ["identifier","first_name","last_name","address","phone"]
      spreadsheet = open_spreadsheet(file)
      header = spreadsheet.row(1)
      (2..spreadsheet.last_row).each do |i|
        row = Hash[[header, spreadsheet.row(i)].transpose]
        employee = find_by_identifier(row["identifier"]) || new
        employee.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k }
        employee.save!
      end
    end
    
    def self.open_spreadsheet(file)
      case File.extname(file.original_filename)
      when ".csv" then Roo::Csv.new(file.path, :ignore)
      when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
      when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
      else raise "Unknown file type: #{file.original_filename}"
      end
    
    end
    
    • 我将 id 更改为搜索标识符。因为在excel中 员工没有 id,但有标识符。并删除员工人数 没有帮助。
    • 另一个变化是' 来自:

      ".csv" 然后是 Csv.new(file.path, nil, :ignore)

    到:

    ".csv" then Roo::Csv.new(file.path, :ignore)
    

    【讨论】:

    • 如果你能解释你做了什么而不仅仅是发布代码,这会让你的答案更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多