2011-03-02 3 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 

La fonction ci-dessus me donne des ajustements. Tout d'abord, il lit dans certaines chaînes à partir d'un fichier texte. Ensuite, il lit dans un fichier texte qui est un modèle pour une partie d'une table HTML. Ensuite, il remplace certains mots-clés dans le fichier modèle par le contenu des chaînes, et enfin, il pousse tout dans un nouveau fichier texte (page_export.html).Ruby: `gsub ': impossible de convertir nil en String (TypeError)

Le problème ici est que certains champs importés dans le fichier texte sont vides, ou du moins, je pense que c'est le problème. De toute façon, je reçois cette erreur:

[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 

Pour y remédier, non seulement je déclare un espace comme un argument par défaut pour chaque chaîne, mais dans une autre partie du script, je boucle à travers chaque chaîne - et si c'est vide, j'ajoute un espace. Toujours pas de chance.

J'ai une fonction presque identique à celle ci-dessus, mais elle opère sur un ensemble de données légèrement différent - celui qui n'a pas de chaînes vides - et cela fonctionne très bien. J'ai également testé le code qui ajoute les espaces, et ça marche bien aussi.

Alors, qu'est-ce que je fais de mal?

+0

merci meagar pour corriger d'affichage :) – m4risU

+0

Ouais désolé, essayant toujours d'envelopper ma tête autour de Markdown ... – eckza

Répondre

3

Tout simplement, l'un de vos arguments de fonction est nil. Peu importe si vous avez fourni des chaînes vides par défaut si vous transmettez un nil po.

Nous ne pouvons pas dire quel argument est nul du code fourni, donc vérifiez-les tous, et, en supposant erreur est levée, commencez à les vérifier individuellement. Ajouter ce qui suit à la partie supérieure de votre fonction:

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

Mise à jour

arguments par défaut ne vous empêche pas de passer dans nil. Ils entrent en vigueur uniquement si vous ne fournissez pas quoi que ce soit.

ici:

def test(x = 3) 
    puts x 
end 

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

Je suppose que je ne comprends pas très bien le concept de «néant» ... est nul son propre type de données? Comme dans, si quelque chose est nul, je ne peux pas lui ajouter un espace, parce qu'un espace est de type string? – eckza

+0

'nil' est de type' NilClass' et vous ne pouvez pas ajouter de chaînes. Tout ce que vous pensez faire en dehors de cette fonction ne fonctionne évidemment pas. La seule façon dont votre erreur pourrait être causée est si l'un de vos arguments à 'gsub' est nul. – meagar

+0

ils ne seront pas nuls, puisque dans la méthode ils obtiennent des valeurs par défaut, n'est-ce pas? – m4risU

0

changement

body = file_as_string(filename) 

dans

throw body = file_as_string(filename) 

Si cela vous donne nul, alors vous avez des problèmes avec le fichier body.tmp.

+0

Eh bien, cela est juste ici le contenu de 'body.tmp': ' No_article Marque: part_make
Modèle: part_model

long_desc list_price ' Je suis presque certain que c'est l'un des paramètres que j'essaie de passer, mais je vais tester cela. Merci. – eckza

+0

Essayé ce que vous avez dit, eu ceci ... 'john @ starfire: ~/code/ruby ​​/ idealm_db_parser $ ruby ​​html_export.rb html_export.rb: 34: dans des ' ': jet uncaught' (NameError) No_article Marque: part_make
Modèle: part_model

long_desc list_price ' ' enquête. – eckza

Questions connexes