Problème avec le rechargement de Zeitwerk

Un nouveau test apparemment a identifié un problème que je pense avoir toujours connu, mais que j’avais toujours ignoré. Maintenant, je ne peux plus l’ignorer car il fait échouer les tests. Voici mes routes :

# 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

Et cela échoue comme ceci :

/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': Nom de route invalide, déjà utilisé : 'pfaffmana
ger'  (ArgumentError)                                                                                                                                                                         
Vous avez peut-être défini deux routes avec le même nom en utilisant l'option `:as`, ou vous remplacez une route déjà définie par une ressource portant le même nom. Pour ce dernier cas, vous pouvez restrei
ndre les routes créées avec `resources` comme expliqué ici :                                                                                                                                     
https://guides.rubyonrails.org/routing.html#restricting-the-routes-created                                                                                                                    
                                                                                                                                                                                              
          raise ArgumentError, "Nom de route invalide, déjà utilisé : '#{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 « J'aime »

Avez-vous vu ce sujet ? Si vous suivez la structure là-bas (et dans le plugin-skeleton), les choses devraient fonctionner assez bien :

Une partie importante de l’autoloading de Zeitwerk concerne les noms/chemins des fichiers, il est donc difficile d’identifier le problème à partir de l’extrait que vous avez partagé. Est-ce dans un fichier plugin.rb ? Ou dans un autre fichier ?

2 « J'aime »

Désolé. C’est config/routes.rb

Mais j’ai aussi . . . des choses . . . dans lib/discourse-pfaffmanager/engine.rb, donc peut-être que je dois déplacer les choses de routes.rb dans lib/pfaffmanager/engine.rb. Lire la doc encore un peu.

1 « J'aime »

Je pense que vous devriez probablement apporter cette modification :

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

De cette façon, le fichier peut être « rechargé » plusieurs fois sans causer de conflit. (« draw » remplacera toute route existante, tandis que « append » lèvera une erreur en cas de conflit)

Cela correspondrait également au squelette de plugin actuel :

3 « J'aime »

Ça a marché !

Toujours si évident une fois qu’on a trouvé.

Merci mille fois.

(Maintenant, si seulement je pouvais faire en sorte que vscode fasse le linting à la sauvegarde des fichiers, mais au moins, cela se produit maintenant localement avant d’être envoyé sur github. . . )

1 « J'aime »

Oui, c’est exactement un changement que j’ai fait récemment.

3 « J'aime »

Ça me rassure un peu. . .

Mais ça t’a pris 4 heures ? :crying_cat_face:

Merci encore, David. J’apprécie vraiment ton soutien.

2 « J'aime »

Pas cette fois, parfois on a de la chance ;). À cette occasion, j’ai lu le guide de David et j’ai noté cette différence par rapport au code que je suivais à l’origine.

Mais bien sûr, certains problèmes se règlent en se promenant dans le parc local le lendemain :deciduous_tree:

1 « J'aime »

Pour information, si je publie un guide sur quelque chose, c’est généralement parce que j’ai perdu de nombreuses heures/jours à essayer de le comprendre moi-même :sweat_smile:. Tout ce qui concerne Zeitwerk entre clairement dans cette catégorie !

:100: :chefs_kiss:

Bien noté. Je les mange tous quand vous publiez. J’aurais dû chercher juste pour zeitwork et peut-être que je l’aurais trouvé. Mais même dans ce cas, le problème n’était littéralement qu’un seul mot qui semblait si anodin.

Maintenant, j’essaie de transformer tout mon contenu {{blah... en \u003cblah... . Ça me tue. Mais je pense que je comprends (assez bien pour le faire dans quelques jours peut-être).

2 « J'aime »

Ce sujet a été automatiquement fermé 30 jours après la dernière réponse. Les nouvelles réponses ne sont plus autorisées.