Ruby:`gsub':无法将nil转换为String(TypeError)

时间:2011-03-02 20:46:54

标签: html ruby parsing gsub

def export_no_sdesc(item_no = " ", make = " ", model = " ", list_price = " ", long_desc = " ", global_image_path = " ")
final_image_path = global_image_path + item_no + ".jpg"
final_thumbs_path = global_image_path + "thumbs/" + item_no + ".jpg"
Dir.glob("body.tmp") do |filename|
    body = file_as_string(filename)
    body = body.gsub("item_no", item_no).gsub("image_path", final_image_path).gsub("image_thumb", final_thumbs_path)
    body = body.gsub("part_make", make).gsub("part_model", model).gsub("long_desc", long_desc).gsub("list_price", list_price)
    File.open('page_export.html', 'a') do |x|
        x.puts body
        x.close
    end
  end
end

以上功能让我适合。首先,它从文本文件中读取一些字符串。然后,它读入一个文本文件,该文件是HTML表的一部分的模板。接下来,它将模板文件中的某些关键字替换为字符串的内容,最后,它将所有关键字推送到新的文本文件(page_export.html)。

这里的问题是文本文件中导入的某些字段是空白的,或者至少,我认为这是问题所在。无论哪种方式,我都会收到此错误:

john@starfire:~/code/ruby/idealm_db_parser$ ruby html_export.rb
html_export.rb:34:in `gsub': can't convert nil into String (TypeError)
from html_export.rb:34:in `export_no_sdesc'
from html_export.rb:31:in `glob'
from html_export.rb:31:in `export_no_sdesc'
from html_export.rb:82
from html_export.rb:63:in `each'
from html_export.rb:63
from html_export.rb:56:in `glob'
from html_export.rb:56

为了解决这个问题,我不仅将空格声明为每个字符串的默认参数,而且在脚本的另一部分中,我遍历每个字符串 - 如果它是空的,我会附加一个空格。仍然没有运气。

我的函数几乎与上面的函数完全相同,但是它操作的数据略有不同 - 一个没有任何空字符串 - 并且效果很好。我还测试了附加空白的代码,它也可以正常工作。

那么,我做错了什么?

2 个答案:

答案 0 :(得分:3)

很简单,你的一个函数参数是nil。如果你传递了nil,那么你是否提供了默认的空字符串无关紧要。

我们不可能从所提供的代码中判断哪个参数是nil,因此请检查它们,并且假设抛出错误,请单独开始检查它们。将以下内容添加到函数顶部:

[item_no, make, model, list_price, long_desc, global_image_path].each do|i|
  throw "nil argument" if i.nil?
end

<强>更新

默认参数不会阻止您传入nil。它们只有在您不提供任何内容时才会生效。

下面:

def test(x = 3)
  puts x
end

test()    # writes '3'
test(nil) # writes 'nil'

答案 1 :(得分:0)

更改

    body = file_as_string(filename)

进入

    throw body = file_as_string(filename)

如果它给你nil,那么你在body.tmp文件中遇到了一些问题。