繁体   English   中英

Rails-升级到ruby 2.2.2-没有将数组隐式转换为String(TypeError)

[英]Rails- upgrading to ruby 2.2.2 - no implicit conversion of Array into String (TypeError)

我一直在研究一个项目,该项目只是读取文件并将其解析以存储到数据库中。 项目运行正常,但是在更新ruby 2.2.2之后运行代码,我收到了以前没有的错误:

in `foreach': no implicit conversion of Array into String (TypeError)

这是导致错误的foreach的代码段:(让我知道是否需要更多代码)。

def parse(file_name)
  File.foreach(file_name).with_index do |line, line_num|
    puts "\nLine #{line_num}: #{line}"

有人知道发生了什么吗? 谢谢

编辑:抱歉,这是一个片段! 我将此红宝石代码称为“ parse_log_file_test”,称为“ parse_log_file_test”

require File.dirname(__FILE__) + '/../test_helper'

class ParseLogFileTest < ActiveSupport::TestCase

  filename = Array.new

  Dir.glob('database/oag-logs/*.log').each do |log_file|

    filename.push(log_file)

  end

  parser = ParseLogFile.new

  parser.parse(filename)

  test 'parse' do
    parser = ParseLogFile.new

    filename.each do |log_file|

      begin

        parser.parse(log_file)
      rescue

        puts"ERROR: Unable to parse line #{log_file}"

      end
    end
    assert true
  end
end

我猜想您省略了函数的end ,但是如果您没有它,那就需要它。

此错误表明传递给file_name进行parse的参数是数组而不是字符串。

但是,在这种情况下,它在Ruby 1.8.4上失败了:

File.foreach([]).with_index do |line, line_num|
  puts "\nLine #{line_num}: #{line}"
end

输出:

TypeError: can't convert Array into String
    from (irb):1:in `foreach'
    from (irb):1:in `with_index'
    from (irb):1
    from :0

因此,我的猜测是,生成传递给您的值以进行parse的代码在您先前的Ruby版本中返回了一个字符串,并在2.2.2中返回了一个数组。

在您的情况下,该错误是由parser.parse(...)test 'parse' do行上方parser.parse(...)的第一次调用引起的,而不是由test方法内部的调用引起的。 我猜您是在迁移后将调用放在那儿,可能是为了调试问题。 但是,您传递给第一个调用的参数与传递给测试方法内部的调用的参数不同,因此,失败的原因与测试方法中的调用原因不同。

要查看测试内部导致的错误,只需删除以下行

      rescue

        puts"ERROR: Unable to parse line #{log_file}"

(保留end否则您也必须删除begin 。)

这样,错误将命中测试运行器,该运行器通常会显示该错误,包括消息和堆栈跟踪。

同意上面的海报,您很可能会丢失引号。 但是,它与2.2.2无关,可能这次您复制文件名的方式有所不同。

因此,显然,这是在Windows上升级到ruby 2.2.2的问题。 经过这个错误后,我只遇到了更多的错误.. nokogiri..etc

我最近有一台Mac,错误消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM