CSV导入:未定义方法'path'

3
我正在尝试导入一个包含地址的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" 的值将只发送文件名。 - Faridco
3个回答

3

请试一下这个

form_tag(import_addresses_path, :multipart => true) do 

multipart选项不是url_for选项的一部分。因此,您必须明确地将它们分开*

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


这是解决方案。 - Lut

0
你已经把地址模型写成了这样:-
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'。CSV.foreach(file.path, headers: true) do |row| - Lut

0

这是你的代码:

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

我加了几个空格...你看到问题了吗? params[:file] 是一个字符串
字符串类没有 path 方法
这就是你看到的错误。
只需移除 .path,它就会正常工作。

嗨Tilo,我已经删除了".path",但是我仍然遇到错误。在AddressesController#import_addresses中出现了Errno::ENOENT错误,找不到文件或目录@ rb_sysopen - insert_direcciones_TEST.csv...CSV.foreach(file, headers: true) do |row| - Lut
你需要将params[:file]设置为本地机器上需要导入的文件名。 - Tilo
1
@Lut 你需要将完整路径作为字符串发送,该路径需要被导入。 - Manish Nagdewani
通常最好不要假设当前工作目录是什么,使用绝对路径更安全。 - Tilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接