2012-07-18 18 views
6

Me aparece un error raro. Mi aplicación funciona perfectamente bien en mi localhost, pero en mi servidor Heroku se está dando este error: TypeError (String can't be coerced into Fixnum):TypeError (¿La cadena no se puede forzar en Fixnum)?

Aquí está mi código:

@rep = rep_score(@u) 

De acuerdo con los registros Esa es la línea que lanza el error. Lo comenté y presioné los cambios en Heroku y la aplicación funciona bien ahora.

Aquí es el rep_score método:

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

También rep_bonus es un número entero en la base de datos.

De nuevo, esto funciona perfectamente bien en localhost. Déjame saber lo que piensas.


Después de retirar return del método rep_score que está funcionando bien. Todavía soy nuevo con Ruby, ¿hay algún problema con poner return? Es un hábito de otros idiomas.

Respuesta

10

Ruby usa + como una herramienta combinada para cadenas Y situaciones matemáticas.

solución sencilla:

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

to_i está cambiando rep_bonus, que es probablemente el modelo de base de datos, a partir de una cadena de resultado en un entero. Hay algunos tipos de transmisiones diferentes que puede configurar. Por nombrar algunas conversiones:

  • Matriz: to_a
  • flotador: to_f
  • Entero: to_i
  • Cadena: to_s
+2

¿Por qué necesito encasillado algo cuando ambos son números enteros ? Y eso no responde por qué funciona en localhost. – Deekor

+1

¿Por qué es una pregunta universal? No tengo la respuesta exacta de por qué, pero soluciona el problema. He encontrado que los enteros extraídos de mis bases de datos no siempre se configuran como el tipo correcto. Si el problema es con mi base de datos (utilicé MySQL) o no, no me interesa averiguarlo ya que un simple tipo de edición corrige todo el problema. Localhost and Production es un entorno completamente diferente. Podrían ser millones de posibilidades Versiones de Ruby diferentes, puertos de gemas no iguales, plataformas diferentes, versiones de bases de datos diferentes ... la lista sigue y sigue, y me quedan 40 caracteres para responder. – CrazyVipa

+0

Si lee mi edición, puede ver que la solucioné para deshacerse del 'retorno' antes de responder esta pregunta. ¿Hay alguna razón por la que la devolución estaba causando el error? – Deekor

Cuestiones relacionadas