Problema com recarregamento do Zeitwerk

Um teste aparentemente novo identificou um problema que acho que eu sabia que tinha, mas sempre ignorei. Agora não posso ignorá-lo porque ele faz os testes falharem. Aqui estão minhas rotas:

# 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

E falha assim:

/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\nct 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}' \\n" \\                                                                                                           
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                             
        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 curtidas

Você já viu este tópico? Se você seguir a estrutura lá (e no plugin-skeleton), as coisas devem funcionar de forma bem tranquila:

Uma parte importante do Zeitwerk autoloading são os nomes/caminhos dos arquivos, então é difícil identificar o problema a partir do trecho que você compartilhou. Isso está em um arquivo plugin.rb? Ou algum outro arquivo?

2 curtidas

Desculpe. Isso é config/routes.rb

Mas eu também tenho . . . coisas . . . em lib/discourse-pfaffmanager/engine.rb, então talvez eu precise mover as coisas de routes.rb para lib/pfaffmanager/engine.rb. ler o manual mais um pouco.

1 curtida

Eu acho que você provavelmente precisa fazer esta alteração:

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

Dessa forma, o arquivo pode ser ‘recarregado’ várias vezes sem causar um conflito. (‘draw’ substituirá qualquer rota existente, enquanto ‘append’ levantará um erro se houver um conflito)

Isso também o faria corresponder ao atual plugin-skeleton:

3 curtidas

Isso resolveu!

Sempre tão óbvio quando é resolvido.

Muito obrigado.

(Agora, se eu pudesse fazer o vscode fazer o linting ao salvar os arquivos, mas pelo menos agora está acontecendo localmente antes de ir para o github. . . )

1 curtida

Sim, essa é exatamente uma alteração que fiz recentemente.

3 curtidas

Isso me deixa um pouco melhor. . .

Mas você levou 4 horas? :crying_cat_face:

Obrigado novamente, David. Eu realmente aprecio seu apoio.

2 curtidas

Desta vez não, às vezes você tem sorte ;). Desta vez, por acaso, li o guia de David e tomei nota dessa diferença em relação ao código que eu estava seguindo originalmente.

Mas claro, alguns problemas levam uma caminhada no parque local no dia seguinte para consertar :deciduous_tree:

1 curtida

Para constar, se eu postar um guia sobre algo, geralmente é porque perdi muitas horas/dias tentando descobrir sozinho :sweat_smile:. Todas essas coisas do Zeitwerk definitivamente se enquadram nessa categoria!

:100: :chefs_kiss:

Entendido. Eu como todos eles quando você posta. Eu deveria ter procurado apenas por zeitwork e talvez o tivesse encontrado. Mas, mesmo assim, o problema era literalmente apenas uma palavra que parecia tão inócua.

Agora estou tentando transformar todo o meu {{blah... em \u003cblah... . Isso está me matando. Mas acho que entendi (bem o suficiente para fazer isso em talvez mais alguns dias).

2 curtidas

Este tópico foi fechado automaticamente 30 dias após a última resposta. Novas respostas não são mais permitidas.