2011-03-02 2 views
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).Ruby: `gsub ': не может преобразовать nil в String (TypeError)

Проблема в том, что некоторые поля, импортируемые в текстовый файл, пусты или, по крайней мере, я думаю, что это проблема. В любом случае, я получаю эту ошибку:

[email protected]:~/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

спасибо meagar за отображение исправления :) – m4risU

+0

Да, извините, все еще пытаюсь обернуть голову вокруг Markdown ... – eckza

ответ

3

Достаточно просто один из аргументов функции: nil. Неважно, если вы отправили пустые строки по умолчанию, если вы передаете nil.

Мы не можем сказать, какой аргумент равен нулю из предоставленного кода, поэтому проверьте их все и, предположив, что ошибка брошена, начните проверять их отдельно. Добавьте следующие строки в верхней части вашей функции:

[item_no, make, model, list_price, long_desc, global_image_path].each do|i| 
    throw "nil argument" if i.nil? 
end 

Update

аргументы по умолчанию не мешают вам переходящая в nil. Они вступают в силу только в том случае, если вы не поставили ничего.

Здесь:

def test(x = 3) 
    puts x 
end 

test() # writes '3' 
test(nil) # writes 'nil' 
+0

Я думаю, что я не совсем понимаю концепцию «ноль» ... это нулевой собственный тип данных? Как и в случае, если что-то нет, я не могу добавить в него пробел, потому что пробел имеет строку типа? – eckza

+0

'nil' имеет тип' NilClass', и вы не можете добавлять к нему строки. Независимо от того, что вы считаете, что вы делаете внешний вид этой функции, очевидно, не работает. Единственный способ, которым может быть вызвана ваша ошибка, - это один из ваших аргументов в 'gsub' равен нулю. – meagar

+0

они не будут nil, так как в методе они получают значения по умолчанию, не так ли? – m4risU

0

Изменить

body = file_as_string(filename) 

в

throw body = file_as_string(filename) 

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

+0

Ну, это прямо здесь содержание 'body.tmp': ' Номер элемента Производитель: part_make
Модель: part_model

long_desc list_price ' Я почти уверен, что это один из параметров, который я пытаюсь пройти, но я проверю это. Благодарю. – eckza

+0

Пробовал, что вы сказали, получил это ... 'john @ starfire: ~/code/ruby ​​/ idealm_db_parser $ ruby ​​html_export.rb html_export.гь: 34: в 'броске ': неперехваченного бросок' (NameError) Номер элемента Марка: part_make
Модель: part_model

long_desc list_price ' ' Исследуя. – eckza

Смежные вопросы