web-dev-qa-db-fra.com

pas de conversion implicite de nil en entier - en essayant d'ajouter quelque chose à un tableau

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"}} ]

11
pedalpete

Erreurs de conversion implicites expliquées

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.

58
DigitalRoss

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 ...

0
JD-

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é. 

0
pedalpete

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
0
boulder_ruby