J'essaie de construire un hachage assez complexe et je reçois étrangement l'erreur
no implicit conversion from nil to integer
quand j'utilise la ligne
manufacturer_cols << {:field => 'test'}
J'utilise la même ligne plus tard dans la même boucle, et cela ne pose aucun problème.
Le code entier est
manufacturer_cols=[]
manufacturer_fields.each_with_index do |mapped_field, index|
if mapped_field.base_field_name=='exactSKU'
#this is where it is breaking, if I comment this out, all is good
manufacturer_cols << { :base_field=> 'test'}
else
#it works fine here!
manufacturer_cols << { :base_field=>mapped_field.base_field_name }
end
end
------- valeur de manufacturer_fields --------
[{"base_field": {"base_field_name": "Catégorie", "id": 1, "name": "Category"}}, {"base_field": {"base_field_name": "Description", "id": 3 , "name": "Short_Description"}}, {"base_field": {"base_field_name": "exactSKU", "id": 5, "name": "Item_SKU"}}, {"base_field": {"base_field_name" : "Markup", "id": 25, "name": "Retail_Price"}}, {"base_field": {"base_field_name": "Famille", "id": 26, "name": "Thème"}} ]
Je ne sais pas exactement pourquoi votre code reçoit cette erreur, mais je peux vous dire exactement ce que l'erreur signifie, et cela aidera peut-être.
Il existe deux types de conversions dans Ruby: explicit et implicite.
Les conversions explicites utilisent le nom abrégé, tel que #to_s
ou #to_i.
. Celles-ci sont généralement définies dans le noyau et sont appelées à tout moment. Ils concernent des objets qui ne sont ni des chaînes ni des entiers, mais qui peuvent être convertis pour le débogage, la traduction de base de données, l’interpolation de chaîne ou autre.
Les conversions implicites utilisent le nom long, tel que #to_str
ou #to_int.
. Ce type de conversion s’applique aux objets qui ressemblent beaucoup à des chaînes ou à des entiers et qui ont simplement besoin de savoir quand prendre la forme de leurs alter ego. Ces conversions ne sont jamais ou presque jamais définies dans le noyau. (Hal Fulton's The Ruby Way identifie Chemin d'accès comme l'une des classes qui trouve une raison de définir #to_str
.)
Il est assez difficile d’obtenir votre erreur, même NilClass
définit des convertisseurs explicites (noms abrégés):
nil.to_i
=> 0
">>#{nil}<<" # this demonstrates nil.to_s
=> ">><<"
Vous pouvez le déclencher comme suit:
Array.new nil
TypeError: no implicit conversion from nil to integer
Par conséquent, votre erreur provient du code C à l'intérieur de l'interpréteur Ruby. Une classe de base, implémentée en C, reçoit une nil
lorsqu'elle s'attend à une Integer
. Il peut avoir un #to_i
mais pas un #to_int
et le résultat est donc le TypeError.
C'était une solution simple pour moi.
Lorsque j'obtenais cette erreur en utilisant l'application Scout, l'un de mes dossiers mappés était l'en-tête-1. Lorsque j'ai supprimé le trait d'union du nom du dossier et que je l'ai créé en-tête1, l'erreur a disparu.
Il n'a pas aimé le trait d'union pour une raison quelconque ...
Cela semble n'avoir aucun lien avec quoi que ce soit qui ait quelque chose à voir avec manufacturer_cols.
J'étais arrivé à la bit manufacturer_cols parce que si je l'ai commenté, tout s'est bien passé.
Cependant, si j'ai commenté la partie où j'ai parcouru le csv un peu plus bas, la page a bien fonctionné également.
Il s’avère que l’erreur était liée à la récupération de la tentative d’ajout du champ base_field alors qu’il était nul.
Je pensais pouvoir utiliser
fabricant_cols.each | col | valeur_base = ligne [col [: index_ligne] .à_i] si col [: fusionne] col [: fusionne] .chaque fusion | valeur_base + = fusion [: séparateur] .to_s + ligne [fusion [: index_fond_gauche]] fin fin fin
malheureusement, cela a causé l'erreur. la solution était
valeur_base = valeur_base + fusionner [: séparateur] .to_s + ligne [fusionner [: index_ronde_de_la-fusion]]
J'espère que cela aide quelqu'un, parce que, comme le mentionnait DigitalRoss, il s'agissait d'une poursuite assez féroce pour chasser l'oie, indiquant exactement où et dans le code ceci était causé.
J'ai eu cette erreur lors de l'analyse d'une API pour "tag/# {idnum}/parents" ... Normalement, vous vous attendriez à une réponse comme celle-ci:
{
"parents": [
{
"id": 8,
"tag_type": "MarketTag",
"name": "internet",
"display_name": "Internet",
"angellist_url": "https://angel.co/internet",
"statistics": {
"all": {
"investor_followers": 1400,
"followers": 5078,
"startups": 13214
},
"direct": {
"investor_followers": 532,
"followers": 1832,
"startups": 495
}
}
}
],
"total": 1,
"per_page": 50,
"page": 1,
"last_page": 1
}
mais quand j’ai cherché les parents de la catégorie de marché «adulte» (pour ainsi dire), j’ai eu
{
"parents": [ ],
"total": 0,
"per_page": 50,
"page": 1,
"last_page": 0
}
Maintenant, Ruby a permis à un certain nombre d'interactions avec cette chose de se produire, mais finalement, il a jeté l'erreur sur la conversion implicite
parents.each do |p|
stats = p['statistics']['all']
selector << stats['investor_followers'].to_i
end
selected = selector.index(selector.max)
parents[selected]['id'] ***<--- CODE FAILED HERE
end