【问题标题】:CSV Import: undefined method `path'CSV 导入:未定义的方法“路径”
【发布时间】:2016-07-03 02:15:00
【问题描述】:

我正在尝试导入带有地址的 CSV。我需要控制器上的“csv”。但是我收到此错误:

NoMethodError in AddressesController#import_addresses

undefined method `path' for "testimport.csv":String

 Address.import(params[:file].path)

地址控制器

class AddressesController < ApplicationController

  require 'csv'

  def import_addresses
    Address.import(params[:file].path)
    redirect_to root_url, notice: "Addresses imported."
  end

地址模型

def self.import(file)
    CSV.foreach(file, headers: true) do |row|
        Address.create! row.to_hash
    end
end

参考:http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

【问题讨论】:

  • 是否包含enctype="multipart/form-data"。没有这个 input type="file" 的值将仅使用文件名发送

标签: ruby csv ruby-on-rails-4


【解决方案1】:

请试试这个

form_tag(import_addresses_path, :multipart => true) do 

multipart 选项不是 url_for 选项的一部分。所以你必须让它们明确分开*

form_tag 没有正确生成,字符串被发送到控制器,而不是对象。

【讨论】:

  • 这就是解决方案。
【解决方案2】:

这是你的代码:

Address.import(   params[:file].path   )

我添加了几个空格...你看到问题了吗?

params[:file] 是一个字符串

String 类没有path 方法

这就是您看到的错误。

只需删除 .path 就可以了

【讨论】:

  • 您好 Tilo,我删除了 .path,但仍然出现错误。在 AddressesController#import_addresses 中的 Errno::ENOENT 没有这样的文件或目录 @ rb_sysopen - insert_direcciones_TEST.csv ...CSV.foreach(file, headers: true) do |row|
  • 您需要将 params[:file] 设置为本地机器上需要导入的文件名
  • @Lut 您需要将完整路径作为需要导入的字符串发送。
  • 最好不要假设当前工作目录是什么——使用绝对路径更安全
【解决方案3】:

你已经这样写了地址模型:-

def self.import(file)
    CSV.foreach(file, headers: true) do |row|
        Address.create! row.to_hash
    end
end

我认为,如果您进行如下更改,它应该可以工作:-

def self.import(file)
        CSV.foreach(file.path, headers: true) do |row|
            Address.create! row.to_hash
        end
    end

希望它有效!

【讨论】:

  • 嗨 Debasish,我已经添加了 file.path,但仍然出现错误。 "insert_direcciones_TEST.csv" 的未定义方法 `path':String CSV.foreach(file.path, headers: true) do |row|
猜你喜欢
  • 2020-05-05
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多