Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

165
Visualizações
Cómo extender correctamente ApplicationRecord en Rails 6 con Zeitwerk

Considere una aplicación de Rails 6 que tenga app/models/application_record.rb . Esta aplicación de Rails 6 utiliza el cargador Zeitwerk.

 class ApplicationRecord end

Si quiero agregar funcionalidad a ApplicationRecord a través de un módulo:

 # app/models/concerns/fancy_methods.rb module FancyMethods def fancy_pants puts "I'm wearing fancy pants" end end

y haz lo siguiente:

 class ApplicationRecord include FancyMethods end

Recibiré una advertencia o un error de desaprobación:

 DEPRECATION WARNING: Initialization autoloaded the constant FancyMethods. Being able to do this is deprecated. Autoloading during initialization is going to be an error condition in future versions of Rails. Reloading does not reboot the application, and therefore code executed during initialization does not run again. So, if you reload FancyMethods, for example, the expected changes wont be reflected in that stale Module object. This autoloaded constant has been unloaded. Please, check the "Autoloading and Reloading Constants" guide for solutions. (called from <top (required)> at /Users/peter/work/recognize/config/environment.rb:5)

He leído muchos artículos, incluidos los documentos de carga automática de Rails , pero nada aborda realmente este caso mínimo pero común de extender ApplicationRecord. Sí, podría envolver ApplicationRecord en un bloque .to_prepare como:

 Rails.configuration.to_prepare do class ApplicationRecord < ActiveRecord::Base include FancyMethods end end

Pero esto parece un olor a código y podría causar otros problemas inesperados ahora o en el futuro.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

¡Lo averigué! El problema era que había un requerimiento explícito en un inicializador que cargaba ApplicationRecord.

 # config/initializers/setup_other_fancy_thing.rb require 'application_record' module OtherFancyThing def also_fancy puts 'also fancy' end end ApplicationRecord.send(:include, OtherFancyThing)

La forma en que depuré esto fue que yo:

  1. Creó una nueva aplicación Rails de la misma versión y no pudo reproducir el error
  2. Copié la aplicación predeterminada.rb y el desarrollo.rb y aún recibí el error
  3. ¡Moví todo el directorio config/initializers a un directorio temporal e hizo que la advertencia desapareciera! Entonces, sabía que tenía que ser uno de los inicializadores. A partir de ahí, solo fue cuestión de dividir y conquistar hasta que encontré el inicializador infractor.
over 4 years ago · Santiago Trujillo Relatório

0

¡Estupendo! Entonces, básicamente, no necesita definir el módulo e incluirlo de esa manera. Idiomáticamente, defines el módulo en su propio archivo, normal:

 # app/models/other_fancy_thing.rb module OtherFancyThing def also_fancy puts 'also fancy' end end

y luego

 # app/models/application_record.rb class ApplicationRecord include FancyMethods end

Cada vez que se carga ApplicationRecord , por ejemplo, como un efecto secundario o cargando algún modelo normal, se cargará FancyMethods sin problemas.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda