简体   繁体   中英

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

very new to ruby and rails.. Ive been working on a project, that simply reads in files and parses them to store into a database. Project was running fine, however running the code after an update to ruby 2.2.2 , I received an error that wasn't previously there:

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

Here is the snippet of the foreach thats causing an error: (let me know if more code is necessary).

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

Does anyone know whats going on? Thank you

EDIT: Sorry it was a snippet! Im calling this ruby code into my rails Test called "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 ,但是如果您没有它,那就需要它。

This error indicates that the argument passed to parse as file_name is an array instead of a string.

However, if that's the case, it fails the same on eg Ruby 1.8.4:

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

Output:

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

Thus my guess is that the code that produces the value you pass to parse returned a string in your previous Ruby version and returns an array in 2.2.2.

In your case, the error is caused by the first invocation of parser.parse(...) , right above the test 'parse' do line, not by the invocation inside the test method. I guess you put that invocation there after the migration, probably to debug a problem. But you are passing a different argument to the first invocation than to the invocation inside the test method, so it fails for a different reason than the one in the test method.

To see what Error is caused inside your test, simply remove the lines

      rescue

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

(Keep the end or you'll have to remove the begin , too.)

This way, an Error will hit the test runner, which will usually display it including message and stack trace.

Agreed with the poster above that you are most likely missing quotation marks. It should have nothing to do with 2.2.2 though, probably you are copy-pastying your file name differently this time around.

So apparently this is an issue with upgrading to ruby 2.2.2 on windows. After getting past this error, I only encountered more errors.. nokogiri..etc

I have recently got a mac and the errors went away.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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