Probleme mit Zeitwerk Reloading

Ein scheinbar neuer Test hat ein Problem identifiziert, von dem ich glaube, dass ich es vielleicht schon kannte, aber immer ignoriert habe. Jetzt kann ich es nicht mehr ignorieren, da es die Tests fehlschlagen lässt. Hier sind meine Routen:

# 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

Und es schlägt wie folgt fehl:

/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': Ungültiger Routenname, bereits in Verwendung: 'pfaffmana\nger' (ArgumentError)
Sie haben möglicherweise zwei Routen mit demselben Namen über die Option `:as` definiert oder Sie überschreiben eine Route, die bereits von einer Ressource mit demselben Namen definiert wurde. Für letzteres können Sie die mit `resources` erstellten Routen wie hier beschrieben einschränken:
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 „Gefällt mir“

Hast du dieses Thema gesehen? Wenn du der Struktur dort (und im Plugin-Skeleton) folgst, sollte alles ziemlich reibungslos funktionieren:

Ein wichtiger Teil des Zeitwerk-Autoloadings sind die Dateinamen/-pfade, daher ist es schwierig, das Problem anhand des von dir geteilten Ausschnitts zu identifizieren. Befindet sich das in einer plugin.rb-Datei? Oder in einer anderen Datei?

2 „Gefällt mir“

Entschuldigung. Das ist config/routes.rb

Aber ich habe auch . . . Zeug . . . in lib/discourse-pfaffmanager/engine.rb, also muss ich vielleicht das Zeug aus routes.rb in lib/pfaffmanager/engine.rb verschieben. noch mehr die RTFM lesen.

1 „Gefällt mir“

Ich denke, Sie müssen wahrscheinlich diese Änderung vornehmen:

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

Auf diese Weise kann die Datei mehrmals ‘neu geladen’ werden, ohne einen Konflikt zu verursachen (‘draw’ ersetzt jede vorhandene Route, während ‘append’ einen Fehler auslöst, wenn es einen Konflikt gibt).

Das würde auch mit dem aktuellen Plugin-Skeleton übereinstimmen:

3 „Gefällt mir“

Das hat funktioniert!

Immer so offensichtlich, wenn es herausgefunden ist.

Tausend Dank.

(Wenn ich jetzt noch VSCode dazu bringen könnte, beim Speichern von Dateien zu linten, aber zumindest geschieht es jetzt lokal, bevor es zu GitHub geht. . . )

1 „Gefällt mir“

Ja, das ist genau eine Änderung, die ich kürzlich vorgenommen habe.

3 „Gefällt mir“

Das stimmt mich schon etwas gnädiger. . .

Aber hast du 4 Stunden gebraucht? :crying_cat_face:

Danke nochmal, David. Ich weiß deine Unterstützung wirklich zu schätzen.

2 „Gefällt mir“

Nicht dieses Mal, manchmal hat man Glück ;). Dieses Mal habe ich zufällig Davids Anleitung gelesen und mir den Unterschied zu dem Code, dem ich ursprünglich gefolgt war, notiert.

Aber sicher, manche Probleme lassen sich am nächsten Tag bei einem Spaziergang im Park lösen :deciduous_tree:

1 „Gefällt mir“

Nur zur Info, wenn ich eine Anleitung zu etwas poste, dann meistens, weil ich selbst viele Stunden/Tage gebraucht habe, um es herauszufinden :sweat_smile:. All diese Zeitwerk-Sachen fallen definitiv in diese Kategorie!

:100: :chefs_kiss:

Zur Kenntnis genommen. Ich esse sie alle, wenn du sie postest. Ich hätte nur nach zeitwork suchen sollen und hätte es vielleicht gefunden. Aber selbst dann war das Problem buchstäblich nur ein Wort, das so harmlos schien.

Jetzt versuche ich, all meine {{blah... Sachen in \u003cblah... umzuwandeln. Es macht mich wahnsinnig. Aber ich glaube, ich verstehe es (gut genug, um es vielleicht in ein paar Tagen zu schaffen).

2 „Gefällt mir“

Dieses Thema wurde 30 Tage nach der letzten Antwort automatisch geschlossen. Neue Antworten sind nicht mehr möglich.