2012-07-18 9 views
6

Ho uno strano errore. La mia app funziona perfettamente bene sul mio localhost, ma sul mio server Heroku che sta dando questo errore: TypeError (String can't be coerced into Fixnum):TypeError (La stringa non può essere forzata in Fixnum)?

Ecco il mio codice:

@rep = rep_score(@u) 

Secondo i registri che è la linea di gettare l'errore. Ho commentato e spinto le modifiche a Heroku e l'app funziona bene ora.

Ecco il metodo rep_score:

def rep_score(user) 
rep = 0 
user.badges.each do |b| 
    rep = rep + b.rep_bonus 
end 
return rep 
end 

anche rep_bonus è un intero nel database.

Anche in questo caso funziona perfettamente su localhost. Fatemi sapere cosa ne pensate.


Dopo aver rimosso return dal metodo rep_score che sta funzionando bene. Sono ancora nuovo a Ruby, c'è qualcosa di sbagliato nel mettere return? È abitudine da altre lingue.

risposta

10

Ruby utilizza + come strumento di combinazione per stringhe E situazioni matematiche.

correzione Semplice:

def rep_score(user) 
rep = 0 
user.badges.each do |b| 
    rep = rep + b.rep_bonus.to_i 
end 
return rep 
end 

to_i sta cambiando rep_bonus, che è probabilmente dal modello di database, dal risultato di una stringa in un numero intero. Ci sono alcuni tipi diversi che puoi impostare. Per citarne alcuni conversioni:

  • Array: to_a
  • Float: to_f
  • Integer: to_i
  • String: to_s
+2

Perché ho bisogno di typecast qualcosa quando sono entrambi interi ? E questo non risponde perché funziona su localhost. – Deekor

+1

Perché è una domanda universale. Non ho la risposta esatta su Perché, ma risolve il problema. Ho scoperto che i numeri interi estratti dai miei database non sono sempre impostati come il tipo giusto. Se il problema riguarda il mio DB (ho usato MySQL) o meno, non mi interessa scoprire come un semplice typecast risolva l'intero problema. Localhost e Production è un ambiente completamente diverso. Potrebbe essere milioni di possibilità. Le versioni di Ruby sono diverse, le porte di gem non sono le stesse, le piattaforme diverse, le versioni di database sono diverse ... la lista va avanti e avanti e ho 40 caratteri a disposizione per rispondere. – CrazyVipa

+0

Se leggi la mia modifica, puoi vedere che l'ho risolto eliminando il 'return' prima di rispondere a questa domanda. C'è un motivo per cui il reso ha causato l'errore? – Deekor

Problemi correlati