Problema con Zeitwerk reloading

Una prueba aparentemente nueva ha identificado un problema que creo que podría haber sabido que tenía, pero que siempre había ignorado. Ahora no puedo ignorarlo porque ahora hace que las pruebas fallen. Aquí están mis rutas:

# frozen_string_literal: true
require_dependency "pfaffmanager_constraint"

Pfaffmanager::Engine.routes.draw do
  get "/" => "pfaffmanager#index", :constraints => PfaffmanagerConstraint.new
  get "/servers" => "servers#index", :constraints => PfaffmanagerConstraint.new
  #      get "#{root_path}/:username/messages/group/:group_name" => "user_actions#private_messages", constraints: { username: RouteFormat.username, group_name: RouteFormat.username }
  get "/servers/group/:group_name" => "servers#index",
      :constraints => PfaffmanagerConstraint.new
  get "/find/:s" => "servers#index", :constraints => PfaffmanagerConstraint.new
  get "/group/:group_name" => "servers#index",
      :constraints => PfaffmanagerConstraint.new
  get "/inventory/:group_name.json" => "servers#inventory",
      :constraints => PfaffmanagerConstraint.new
  get "/servers/:id" => "servers#show",
      :constraints => PfaffmanagerConstraint.new
  get "/servers/:id/edit" => "servers#edit",
      :constraints => PfaffmanagerConstraint.new
  put "/servers/:id" => "servers#update",
      :constraints => PfaffmanagerConstraint.new
  delete "/servers/:id" => "servers#delete",
         :constraints => PfaffmanagerConstraint.new
  put "/status/:id" => "servers#update_status",
      :constraints => AdminConstraint.new
  post "/api_key/:id" => "servers#set_api_key",
       :constraints => PfaffmanagerConstraint.new
  put "/update_server_status/:id" => "servers#update_server_status",
      :constraints => PfaffmanagerConstraint.new
  post "/upgrade/:id" => "servers#queue_upgrade",
       :constraints => PfaffmanagerConstraint.new
  put "/install/:id" => "servers#install",
      :constraints => PfaffmanagerConstraint.new
  get "/ssh_key/:id" => "serverkeys#get_pub_key"
  get "/ssh-key/:hostname" => "serverkeys#get_pub_key_by_hostname",
      :constraints => {
        hostname: %r{[^/]+}
      }
  post "/servers" => "servers#create",
       :constraints => PfaffmanagerConstraint.new
end

Discourse::Application.routes.append do
  mount ::Pfaffmanager::Engine, at: "/pfaffmanager"
end

Y falla así:

/home/pfaffman/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/actionpack-7.0.7/lib/action_dispatch/routing/route_set.rb:588:in `add_route': Invalid route name, already in use: 'pfaffmana
nger'  (ArgumentError)
You may have defined two routes with the same name using the `:as` option, or you may be overriding a route already defined by a resource with the same naming. For the latter, you can restri
ct the routes created with `resources` as explained here:
https://guides.rubyonrails.org/routing.html#restricting-the-routes-created

          raise ArgumentError, "Invalid route name, already in use: '#{name}' \
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        from /home/pfaffman/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/actionpack-7.0.7/lib/action_dispatch/routing/mapper.rb:1985:in `add_route'
        from /home/pfaffman/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/actionpack-7.0.7/lib/action_dispatch/routing/mapper.rb:1956:in `decomposed_match'
2 Me gusta

¿Has visto este tema? Si sigues la estructura allí (y en el plugin-skeleton), las cosas deberían funcionar bastante bien:

Una parte importante del autoloading de Zeitwerk son los nombres/rutas de los archivos, por lo que es difícil identificar el problema a partir del fragmento que compartiste. ¿Está eso en un archivo plugin.rb? ¿O en algún otro archivo?

2 Me gusta

Lo siento. Eso es config/routes.rb

Pero también tengo . . . cosas . . . en lib/discourse-pfaffmanager/engine.rb, así que tal vez necesite mover las cosas de routes.rb a lib/pfaffmanager/engine.rb. Leer el manual (RTFM) un poco más.

1 me gusta

Creo que probablemente necesites hacer este cambio:

- Discourse::Application.routes.append do
+ Discourse::Application.routes.draw do

De esa manera, el archivo se puede ‘recargar’ varias veces sin causar un conflicto (‘draw’ reemplazará cualquier ruta existente, mientras que ‘append’ generará un error si hay un conflicto).

Eso también haría que coincida con el ‘plugin-skeleton’ actual:

3 Me gusta

¡Eso lo solucionó!

Siempre es tan obvio cuando se ha resuelto.

Gracias un millón.

(Ahora, si pudiera hacer que vscode hiciera el linting al guardar archivos, pero al menos ahora está sucediendo localmente antes de que llegue a GitHub…)

1 me gusta

Sí, ese es exactamente un cambio que hice recientemente.

3 Me gusta

Eso me hace sentir un poco mejor. . .

¿Pero te llevó 4 horas? :crying_cat_face:

Gracias de nuevo, David. Realmente aprecio tu apoyo.

2 Me gusta

En esta ocasión no, a veces tienes suerte ;). En esta ocasión, leí la guía de David y tomé nota de esa diferencia con el código que había estado siguiendo originalmente.

Pero claro, algunos problemas se solucionan dando un paseo por el parque local al día siguiente :deciduous_tree:

1 me gusta

Para que lo sepas, si publico una guía sobre algo, generalmente es porque perdí muchas horas/días tratando de resolverlo yo mismo :sweat_smile:. ¡Todo este asunto de Zeitwerk definitivamente entra en esa categoría!

:100: :chefs_kiss:

Entendido. Los como todos cuando los publicas. Debería haber buscado solo zeitwork y quizás lo habría encontrado. Pero incluso entonces, el problema era literalmente una palabra que parecía tan inocua.

Ahora estoy intentando convertir todo mi {{blah... en \u003cblah... . Me está matando. Pero creo que lo entiendo (lo suficiente como para hacerlo en quizás unos días más).

2 Me gusta

Este tema se cerró automáticamente 30 días después de la última respuesta. Ya no se permiten nuevas respuestas.