【问题标题】:Ruby: `gsub': can't convert nil into String (TypeError)Ruby:`gsub':无法将 nil 转换为字符串(TypeError)
【发布时间】:2011-03-03 05:12:31
【问题描述】:
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

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

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

那么,我做错了什么?

【问题讨论】:

  • 感谢 meagar 修复显示 :)
  • 是的,对不起,我还在想着 Markdown...

标签: html ruby parsing gsub


【解决方案1】:

很简单,您的函数参数之一是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'

【讨论】:

  • 我想我不太了解'nil'的概念...... nil 是它自己的数据类型吗?如,如果某事为 nil,我不能在其上附加空格,因为空格是字符串类型的?
  • nilNilClass 类型,您不能将字符串附加到它。无论你认为你在这个函数外部做什么检查显然都不起作用。可能导致您的错误的唯一方法是,如果您对 gsub 的参数之一为 nil。
  • 它们不会为零,因为在方法中它们会获得默认值,不是吗?
  • @m4risU 这不是默认值的工作方式。它们可以是 nil,而且几乎可以肯定是 nil。查看我的更新。
  • 哇哦。不知道,非常感谢。不过,有没有办法用空字符串替换 nil 值?如果没有数据,我只需要该字段为空白即可。
【解决方案2】:

改变

    body = file_as_string(filename)

进入

    throw body = file_as_string(filename)

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

【讨论】:

  • 嗯,这就是 'body.tmp' 的内容:<tr> <td>item_no</td> <td><a href="image_path" align="center"><img src="image_thumb"/></a></td> <td>Make: part_make<br />Model: part_model</br /><br />long_desc</td> <td>list_price</td> </tr> 我几乎可以肯定这是我要传递的参数之一,但我会测试这个。谢谢。
  • 试了你说的,得到了​​这个...john@starfire:~/code/ruby/idealm_db_parser$ ruby html_export.rb html_export.rb:34:in throw':未捕获的投掷<tr> (NameError) <td>item_no</td> <td><a href="image_path" align="center"><img src="image_thumb" /></a></td> <td>Make: part_make<br />Model: part_model</br /><br />long_desc</td> <td>list_price</td> </tr> '调查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多