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

簡単に言えば、関数の引数の 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'
于 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 に答える