2011-03-02 12 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을 전달하는 경우 기본 빈 문자열을 제공했는지는 중요하지 않습니다.

제공된 코드에서 어떤 인수가 nil인지 알 수 없으므로 모두 확인하고 오류가 발생하면 개별적으로 검사를 시작하십시오. 당신의 함수의 상단에 다음을 추가

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

업데이트 nil 전달에 방해가되지 않는

기본 인수. 을 입력하지 않으면 효과가 없습니다. 여기

:

throw body = file_as_string(filename) 

def test(x = 3) 
    puts x 
end 

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

나는 'nil'의 개념을 이해하지 못한다고 생각합니다 ... nil 자체 데이터 유형이 아닙니까? 에서와 같이, 무언가가있는 경우 공백이 문자열 형식이기 때문에 공백을 추가 할 수 없습니까? – eckza

+0

'nil'은'NilClass' 타입이고 문자열을 추가 할 수 없습니다. 이 기능을 외부에서 수행하고 있다고 생각하는 것이 무엇이든간에 분명히 작동하지 않습니다. 오류가 발생할 수있는 유일한 방법은'gsub'에 대한 인수 중 하나가 nil 인 경우입니다. – meagar

+0

메소드에서 기본값을 얻으므로 그 값은 0이 아닙니다. – m4risU

0

변경

body = file_as_string(filename) 

당신이 다음 body.tmp 파일 몇 가지 문제를 가지고 nil을 제공합니다.

+0

음, 여기이 'body.tmp'의 내용입니다 나는 이것이 내가 통과 시키려고하는 매개 변수 중 하나임을 거의 확신하지만, 이것을 시험 할 것이다. 감사. – eckza

+0

당신이 말한 것을 시도해보십시오 ... 'john @ starfire : ~/code/ruby ​​/ idealm_db_parser $ ruby ​​html_export.rb html_export.RB : 34 :'던져에서 'part_make
모델 : 캐치되지 않는 던져' (나가서 설명하자면 NameError가) 이 만들기 item_no part_model

long_desc list_price '를' 은 조사. – eckza

관련 문제