{"record":{"id":"d543edd85718c8d2","repo":"padrino/padrino-framework","slug":"please-do-not-use-register-on-padrino-applicat","errorCode":null,"errorMessage":"Please, do not use `register` on Padrino::Application object, use `.dup` or subclassing","messagePattern":"Please, do not use `register` on Padrino::Application object, use `\\.dup` or subclassing","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"padrino-helpers/lib/padrino/rendering.rb","lineNumber":63,"sourceCode":"    ##\n    # Default options used in the resolve_template-method.\n    #\n    DEFAULT_RENDERING_OPTIONS = { strict_format: false, raise_exceptions: true } unless defined?(DEFAULT_RENDERING_OPTIONS)\n\n    class << self\n      ##\n      # Default engine configurations for Padrino::Rendering.\n      #\n      # @return {Hash<Symbol,Hash>}\n      #   The configurations, keyed by engine.\n      def engine_configurations\n        @engine_configurations ||= {}\n      end\n\n      def registered(app)\n        if defined?(Padrino::Application) && app == Padrino::Application\n          # this fail can be removed later when jRuby is not bugged and MRI19 is dropped\n          raise 'Please, do not use `register` on Padrino::Application object, use `.dup` or subclassing'\n        end\n        included(app)\n        engine_configurations.each do |engine, configs|\n          app.set engine, configs\n        end\n      end\n\n      def included(base)\n        base.send(:include, InstanceMethods)\n        base.extend(ClassMethods)\n      end\n    end\n\n    ##\n    # Class methods responsible for rendering templates as part of a request.\n    #\n    module ClassMethods\n      ##","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/padrino/padrino-framework/blob/167044f3d56b2bce12f943eb826fdb0b0ea94375/padrino-helpers/lib/padrino/rendering.rb#L45-L81","documentation":"Padrino::Rendering#registered raises when a module is registered directly on the Padrino::Application base class (app == Padrino::Application). Registering on the base class would mutate engine configuration and settings shared by every Padrino app in the process, so Padrino forces you to apply modules to a subclass or a duplicate instead.","triggerScenarios":"Calling Padrino::Application.register MyModule at the top level; using the old Padrino 0.9 pattern Padrino::Application.register Padrino::Rendering; any register helper invocation whose app argument is exactly the Padrino::Application class object.","commonSituations":"Migrating a Sinatra app where Sinatra::Application.register was idiomatic; following outdated tutorials or books that show registration on the base class; gem authors trying to auto-register their module with the framework globally on load.","solutions":["Create an app subclass and register inside it: class MyApp < Padrino::Application; register MyModule; end","If you need a disposable base class, use Padrino::Application.dup and register on the copy","For libraries, ship a plain module that users register inside their own app subclass instead of touching Padrino::Application"],"exampleFix":"# before\nPadrino::Application.register MyModule\n\n# after\nclass MyApp < Padrino::Application\n  register MyModule\nend","handlingStrategy":"validation","validationCode":"def safe_register(app, mod)\n  raise 'register on an app subclass, not Padrino::Application' if app.equal?(Padrino::Application)\n  app.register(mod)\nend","typeGuard":"def padrino_app_subclass?(klass)\n  klass.is_a?(Class) && klass < Padrino::Application && !klass.equal?(Padrino::Application)\nend","tryCatchPattern":null,"preventionTips":["Always register modules inside class MyApp < Padrino::Application","When migrating from Sinatra, grep for Application.register and move registrations into app subclasses","Treat Padrino::Application as read-only shared state in published gems"],"tags":["padrino","register","sinatra-migration","module","application-setup"],"backgroundTag":"framework-base-class-mutation","analyzedSha":"167044f3d56b2bce12f943eb826fdb0b0ea94375","analyzedAt":"2026-08-23T12:41:41.049Z","schemaVersion":2},"datasetVersion":"2026-08-23T16:17:53.355Z"}