1
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

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

我有一个与上面的函数几乎相同的函数,但它对一组略有不同的数据进行操作——一个没有任何空字符串的数据——而且效果很好。我还测试了附加空格的代码,它也可以正常工作。

那么,我做错了什么?

4

2 回答 2

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'
于 2011-03-02T20:53:20.770 回答
0

改变

    body = file_as_string(filename)

进入

    throw body = file_as_string(filename)

如果它给你 nil,那么你的 body.tmp 文件有一些问题。

于 2011-03-02T21:01:10.240 回答