Skip to content

2020_12 Actualización de rails 6.0 a rails 6.1

Vladimir Támara Patiño edited this page Mar 22, 2021 · 26 revisions

1. Introducción

Aplica el procedimiento general de actualización descrito en {ACT2020}, al que complementariamos que primero deben actualizarse los motores desde los más básicos (en Pasos de Jesús comenzamos con sip) hasta los que usen más motores. A medida que se actualicen todos los motores y librerías de las que dependa una aplicación esta puede actualizarse.

La actualización de cada motor o aplicación se hace como se explica en {ACT2020}:

  • Tener pruebas de regresión operando en la última versión parche de la serie 6.0 (e.g 6.0.3.5)
  • Pasar a la última versión parche de la versión menor siguiente (e.g 6.1.3) especificandolo en Gemfile por ejemplo con:
gem 'rails', '~> 6.1'
  • Actualizar dependencias a unas que usen Rails 6.1 y ejecutar bundle update; bundle install
  • Ejecutar bin/rails app:update para actualizar archivos manejados por rails (en algunos motores puede requerir ejecutarlo tanto en el directorio principal como en test/dummy). Se remplazarán algunos archivos (debe ser especialmente cuidadoso y mezclar cambios a config/boot.rb, config/routes.rb, config/application.rb, config/environment.rb, config/initializers/assets.rb y en sitios de producción con config/environments/production.rb) y se crearán por lo menos archivos config/initializers/permissions_policy.rb, config/initializers/new_framework_defaults_6_1.rb, así como migraciones para ActiveStorage que puede eliminar si no usa ActiveStorage.
  • Contar con bin/yarn en aplicaciones o con test/dummy/bin/yarn en motores. Puede copiarlo de una aplicación rails nueva o por ejemplo de https://raw.githubusercontent.com/pasosdeJesus/sip/rails61/test/dummy/bin/yarn
  • Editar config/initializers/new_framework_defaults_6_1.rb y activar las diversas opciones de configuración, mientras se lean notas específicas de cada una en {ACT2020}
  • Asegurar que siguen pasando las pruebas de regresión y/o arreglar.

Una vez han pasado las pruebas en todos los motores y aplicaciones cambiar en cada uno en config/application.rb:

config.load_defaults 6.1 

Y finalmente eliminar en cada motor y aplicación el archivo config/initializers/new_framework_defaults_6_1.rb y la línea config.load_defaults 6.1 de config/application.rb

2. Cambios específicos para motores

El método para tener variables de configuración para un motor descrito en https://stackoverflow.com/questions/20734766/rails-mountable-engine-how-should-apps-set-configuration-variables#20735466 y usando en varios motores de Pasos de Jesús no opera y produce el error TypeError: module attributes should be defined directly on class, not singleton. La solución recomendada en https://github.com/rails/rails/issues/40831 es no usar una clase singleton para declarar las variables como mattr_accessor y para definirlas, sino declararlas y definirlas directamente en el módulo del motor usando self. Por ejemplo en cor1440_gen en lib/cor1440_gen/engine.rb se cambiaron declaraciones y definiciones de la forma:

class << self
    mattr_accessor :actividadg1
    self.actividadg1 = "Mujeres organización" 
end

por

  self.mattr_accessor :actividadg1                                               
  self.actividadg1 = "Mujeres organización"                                      

3. Cambios en API

  • Las consultas con pluck en 6.1 no reciben una lista (como en 6.0) sino una serie de parámetros. En lugar de cons.pluck([:id, :nombre]) usar cons.pluck(:id, :nombre) o con el operador splash cons.pluck(*[:id, :nombre])
  • ActiveRecord::Base.configurations[Rails.env] usa símbolos como llaves en 6.1, mientras que usaba cadenas como llaves en 6.0. Así en lugar de ActiveRecord::Base.configurations['development']['database'] debe usarse ActiveRecord::Base.configurations['development'][:database]

4. Problemas y soluciones

  • Con algunas aplicaciones nos ha ocurrido que se congelan en ejecución cuando están regenerando recursos (parece en medio de la generación de recursos manejados por sprockets). Nos ha servido:
    1. Asegurar que config/initializers/assets.rb está vacio para tomar configuración proveniente de sip
    2. En app/assets/stylesheets/application.css dejar require self como última entrada, y require_tree . como penúltima.
    3. En config/initializers/punto_montaje.rb no anteponer / a la ruta de los recurso es decir sip/assets en lugar de /sip/assets

5. Devolver de 6.1 a 6.0

Reportamos un error en rails 6.1 que nos requirió devolver temporalmente de 6.1 a 6.0, en lugar de deshacer commits nos funcionó:

  • Cambiar la versión en Gemfile (y en gemas podría requerirse también en el archivo .gemspec)
  • En el archivo config.ru quitar la línea Rails.application.load_server

6. Bibliografía

Clone this wiki locally