Tagged:Ruby on rails

Rails: Servir assets precompilados en entorno development

Llevo varios días trabajando en la integración del framework Metronic dentro de una aplicación Rails, y uno de los problemas con que me encontré fue la desaparición de los assets de Metronic al pasar a producción (aunque en entorno de desarrollo todo se veía bien). El problema era que el precompilado de assets no estaba incluyendo bien las rutas de todos los ficheros de Metronic. Al final, después de dar muchas vueltas y leer mucho sin que todo esto me terminara de aclarar la solución, decidí que la mejor manera para encontrar la respuesta era el método de prueba y error, así que me puse manos a la obra. El problema de este método es que necesitaba subir mis cambios al servidor en producción cada vez que hacía modificaciones, por lo que perdía mucho tiempo. Después de unas pocas pruebas infructuosas decidí que tenía que haber una manera de usar los assets precompilados también en el entorno de desarrollo, así que busqué y busqué hasta que encontré la respuesta: En el fichero /config/environments/development.rb hay varias líneas que controlan la manera en la que se comporta la inclusión de assets, en particular:


  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true

Poniendo config.assets.debug a false conseguimos lo que queremos: que en el entorno de desarrollo se llame también a mis assets precompilados (en /public/assets) en vez de a los assets en bruto de /app/assets. A partir de este momento pude trabajar de manera mucho más fluida (todo lo fluida que Webrick me permitió, pues parece que servir ficheros un poco pesados no es lo suyo porque añade bastante latencia).

Por supuesto entre prueba y prueba había que precompilar assets (rake assets:precompile), y reiniciar Webrick, pero nada comparado con tener que subir decenas de carpetas al servidor cada vez.

Finalmente la integración de Metronic quedó perfectamente funcional también en producción 🙂

Tipos de datos para migraciones de ActiveRecord

Al realizar el andamiaje (scaffolding) de un nuevo objeto en Rails siempre tenía la duda de qué tipos eran los que podía utilizar. Después de dar algunas vueltas encontré que los tipos disponibles para ActiveRecord de Rails 4.2.0 son los siguientes:

  • :primary_key,
  • :string,
  • :text,
  • :integer,
  • :float,
  • :decimal,
  • :datetime,
  • :time,
  • :date,
  • :binary, y
  • :boolean

La fuente de esta información es la documentación de ActiveRecord, que al final siempre termina siendo la mejor para informarnos de este tipo de cosas, a pesar de que no es muy amigable:
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#method-i-column

Instalar Ruby 2.1 y Ruby on Rails 4.2.0 en Windows 7

En el momento de escribir este post:
Versión de Ruby : 2.1.5
Versión de RubyGems : 2.4.6
Versión de Rails : 4.2.0

Hace tiempo escribí un post sobre cómo instalar Ruby on Rails en Windows 7, pero a estas alturas se ha quedado algo anticuado, ya que el proceso ha variado en varios aspectos. El más importante es que ya no es necesario instalar una dll externa para sqlite3, que la gem para sqlite3 tiene otro nombre, y que por algún motivo el gestor de rubygems no se instala bien de manera automática, por lo que hay que reinstalarlo.

He de decir que en realidad en el momento de escribir este post la última versión de ruby es la 2.2.1, sin embargo después de 2 horas peléandome con la instalación (sobre todo por el soporte para sqlite3 que no viene de serie y no conseguí poner en marcha), decidí hacer caso a la recomendación a fecha de hoy de rubyinstaller.org:

we recommend you use Ruby 2.1.X installers. These provide a stable language and a extensive list of packages (gems) that are compatible and updated.

Si no queréis perder tiempo, os recomiendo lo mismo, al menos hasta que el soporte para sqlite3 venga de serie en las gems de ruby 2.2.

Dicho esto, los pasos son:

  1. Instalar ruby, usuando el instalador que descargaremos de http://rubyinstaller.org. Al hacerlo, hay que asegurarse de tildar la opción que indica que actualicemos la variable de PATH para que esta versión de ruby esté disponible desde la línea de comandos. Si tenías una versión de Ruby anterior, este cambio en el path hará que la versión por defecto sea la nueva. En caso de que se te haya olvidado activar esta opción, bastará con acceder a las variables del sistema, cambiar manualmente el path y abrir una nueva consola.
  2. «gem install rails --no-ri --no-rdoc» seguramente tirará el error

    Could not find a valid gem ‘rails’ (>= 0), here is why: Unable to download data from https://rubygems.org/ – SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz)

    en cuyo caso la mejor solución es descargar manualmente la utilidad rubygems desde https://rubygems.org/pages/download (formato zip), después descomprimirlo manualmente en una carpeta, entrar en ella y ejecutar «ruby setup.rb«. Esto instalará correctamente la utilidad y podremos seguir adelante. Encontré otra solución que consiste en decirle al comando gem que en vez de usar https use http para la descarga (gem source -a http://rubygems.org/), pero al ejecutar el bundler más adelante se vuelve a quejar de problemas de conexión SSL, mientras que reinstalando rubygems el problema se soluciona correctamente.

  3. Ahora sí: gem install rails --no-ri --no-rdoc
  4. Instalar el development kit, que permitirá compilar gems nativas. Descargarlo de http://rubyinstaller.org/downloads/, descomprimirlo en algún sitio, acceder a la carpeta y ejecutar «ruby dk.rb init» y después «ruby dk.rb install» para asociarlo a nuestra nueva instalación de ruby.
  5. cd /ruta/hacia/la/carpeta/del/proyecto
  6. rails new nombre_proyecto
  7. rails server

Y listo. Nada de pelearse más con sqlite3! 🙂
Espero que sea de utilidad. ¡Y happy Railing!

{ Piensa / Think }

"This is a waste of life. [...] the entire educational system in the modern day is nothing more than a cookie cutter processing plant that prepares humans for mostly predefined occupational roles. This element of human life has become so traditionally ingrained, that many falsely consider the nature of ‘having a job’ some form of human instinct. Even parents will ask their kids “What do you want to be when you grow up?” as though there was only one thing. This is disturbing and a violation of human potential." - The Zeitgeist Movement


"He aprendido que hay cosas que pueden ser comprendidas pero que nunca podrán ser explicadas con palabras sin desvirtuar su grandeza" - Andrés Pascual


"You never change things by fighting the existing reality. To change something, build a new model that makes the existing model obsolete." - Buckminster Fuller


"... I am the master of my fate. I am the captain of my soul." - William Ernest Henley