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
为了解决这个问题,我不仅将空格声明为每个字符串的默认参数,而且在脚本的另一部分中,我遍历每个字符串 - 如果它是空的,我会附加一个空格。仍然没有运气。
我的函数几乎与上面的函数完全相同,但是它操作的数据略有不同 - 一个没有任何空字符串 - 并且效果很好。我还测试了附加空白的代码,它也可以正常工作。
那么,我做错了什么?
答案 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文件中遇到了一些问题。