Rails <2.1 con ruby 1.8.7, broken!
Publicado por blaxter - 18 Jul 2008 a las 21:08Es muy peligroso, de locos más bien (o aventureros), usar últimas versiones (aka debian testing/unstable) únicamente de ciertas "cosas" (llámese cosas a librerías, paquetes, lenguajes, etc...).
Me he encontrado con un problema curioso debido al uso del interprete de ruby en una de sus últimas versiones estables (1.8.7) con el framework rails en una versión que no es la última (2.0.2).
Habría que mencionar que rails 2.0.2 salió en diciembre del año pasado, mientras que ruby 1.8.7 es de apenas mes y medio por lo que es comprensible el fallo.
El problema está en que en ruby 1.8.7 se han añadido muchas cosas nuevas, como, por ejemplo, el método chars a la clase String:
ruby 1.8.7 (2008-05-31 patchlevel 0) [i486-linux]
$ irb
>> foo = "I love popcorns".chars
=> #<Enumerable::Enumerator:0xb7c0206c>
>> foo.first.class
=> String
Método inspirado en el activesupport de rails:
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
$ irb
>> "Hello world?".chars
NoMethodError: undefined method 'chars' for "Hello world?":String
$ cd /some/rails/project/ && script/console
Loading development environment (Rails 2.0.2)
>> "Hola hola".chars
=> #<ActiveSupport::Multibyte::Chars:0xb74d0050 @string="Hola hola">
Es decir, en rails se definía un método que devolvía un ActiveSupport::Multibyte::Chars, pero si ejecutamos en un interprete 1.8.7 nos encontraremos que al ejecutar el método chars de una String, nos devolverá un Enumerator por lo que ahí ya puede pasar de todo (mayormente porque son cosas diferentes y así mal asunto).
La solución, si queremos seguir usando rails 2.0.2, es realmente simple. Si no queremos pensar, podemos ver cómo lo han solucionado en el HEAD de rails. Y simplemente añadimos esta solución en algún initializer (por ejemplo en config/initializers/fixes.rb):
String.class_eval { remove_method :chars }
rescue NameError
# all Ok
end
De esta forma, nos eliminará el método chars de String y podemos usar el definido en ActiveSupport en la metaclase de String. Es decir, como si aquí no hubiera pasado nada.
Por cierto, hay otros temas similares en cuanto a compatibilidad con ruby 1.8.7, relacionados con String#start_with?/end_with? y Enumarable#group_by pero mucho más simples y no tan "graves".
3 Comentarios »
RSS feed para los comentarios de esta entrada. TrackBack URI
Dejar un comentario
Esta obra está bajo una
licencia de Creative Commons.
Este blog funciona gracias a WordPress
con el theme GimpStyle
diseñado por Horacio Bella y adaptado por un servidor.
Feed entradas
EXELENTE !!! No sabes hace cuanto tiempo estaba buscando la solución a este problema. Pasé mucho tiempo tratando de cachar cual era mi problema.. hasta que vi que en mi servidor de producción habían puesto ruby 1.8.7 y yo sigo usando 1.8.4
En fin, muchas gracias por compartir con el ciberespacio y felicitaciones por haber cachado la solución !
Comentario por Roberto — 15 Agosto, 2008 @ 0:13 #
Ama plavix….
Plavix official. Plavix. Plavix law suit. Plavix how long….
Trackbacks por Free prescription drug plavix. — 5 Septiembre, 2008 @ 3:27 #
Yo también he tenido mis problemas con ruby 1.8.7, al actualizarme a ubuntu 8.10:
http://www.jaimeiniesta.com/2008/11/01/cuidado-con-ubuntu-810-viene-con-ruby-187/
Comentario por Jaime Iniesta — 2 Noviembre, 2008 @ 15:53 #