2017-04-25 1 views
0

Im essayant de eval cette fonction et sembleRuby TypeError - pas de conversion implicite de Fixnum en String?

cette erreur

TypeError - aucune conversion implicite de Fixnum dans une chaîne

eval("File.open('nagai.txt', 'a+') do |f| \n f. puts parts[" + params[:salutation].to_i + "] \n end") 

comment je pouvais résoudre

+1

Ne faites pas cela. Votre code est vulnérable. –

+0

Que puis-je faire pour l'améliorer – zzero

+0

Je dois passer des variables – zzero

Répondre

2

Ce code est extrêmement risqué et je ne peux pas voir une raison de le faire en premier lieu. Retirez le eval et vous obtenez ce code très simple:

File.open('nagai.txt', 'a+') do |f| 
    f.puts parts[params[:salutation]] 
end 

L'erreur vient d'essayer de concaténer un Fixnum/entier à une chaîne dans le processus de construction du code puis eval. Ce code est invalide et donne la même erreur:

"1" + 1 

Ruby est pas comme d'autres langages tels que JavaScript, PHP ou Perl qui convertissent arbitrairement entiers en chaînes et vice-versa. Il y a une séparation difficile entre les deux et toute conversion doit être spécifiée avec des choses comme .to_s ou .to_i.

Cette version corrigée doit être équivalente. Si vous devez reporter ceci à un moment ultérieur, vous pouvez écrire une méthode:

def write_nagai(params) 
    File.open('nagai.txt', 'a+') do |f| 
    f.puts parts[params[:salutation]] 
    end 
end 
+0

Je crois que c'est vice versa : 'params [: salutation]' est une instance de chaîne passée à un tableau qui attend un index entier. – mudasobwa

+0

@mudasobwa Maintenant que j'ai lu ce code, je me rends compte que c'est un cas classique d'essayer de concaténer chaîne + entier + chaîne qui génère toujours une erreur. Le hachage est un rouge-hareng. L'étrange couche "eval" ajoute beaucoup de confusion. Merci d'avoir fait remarquer que je ne l'avais pas épinglé. – tadman

+0

très merci, cela m'aide tellement – zzero