Ruby: `gsub ': невозможно преобразовать nil в String (TypeError) - PullRequest
1 голос
/ 02 марта 2011
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 ]

3 голосов
/ 02 марта 2011

Проще говоря, один из аргументов вашей функции - nil.Неважно, если вы предоставили пустые строки по умолчанию, если вы передаете nil in.

Мы не можем сказать, какой аргумент равен 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'
0 голосов
/ 03 марта 2011

Измените

    body = file_as_string(filename)

на

    throw body = file_as_string(filename)

Если он дает ноль, у вас есть некоторые проблемы с файлом body.tmp.

...