Проблемы с перезагрузкой Zeitwerk

Появился новый тест, который выявил проблему, о которой я, возможно, и так догадывался, но всегда игнорировал. Теперь игнорировать её нельзя, так как из-за неё тесты не проходят. Вот мои маршруты:

# 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

И ошибка возникает так:

/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
ger'  (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}' \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'  

Вы видели эту тему? Если вы следуете структуре там (и в шаблоне плагина), всё должно работать довольно гладко: Structuring a plugin for Rails autoloading Важной частью автозагрузки Zeitwerk являются имена файлов и пути, поэтому по приведённому вами фрагменту сложно определить проблему. Это в файле plugin.rb или в каком-то другом файле?

Извините. Это config/routes.rb.

Но у меня также есть… всякое… в lib/discourse-pfaffmanager/engine.rb, так что, возможно, мне нужно переместить код из routes.rb в lib/pfaffmanager/engine.rb. Ещё раз перечитать документацию.

Я думаю, вам, вероятно, нужно внести следующее изменение:

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

Таким образом, файл можно будет «перезагружать» несколько раз без возникновения конфликтов. («draw» заменит существующий маршрут, тогда как «append» вызовет ошибку в случае конфликта).

Это также приведёт его в соответствие с текущим шаблоном плагина:

Вот и всё!

Всегда кажется очевидным, когда уже разобрались.

Огромное спасибо.

(Теперь бы ещё настроить VSCode так, чтобы он делал линтинг при сохранении файлов, но хотя бы теперь это происходит локально перед отправкой в GitHub…)

Да, именно это изменение я недавно внес.

Это немного меня успокаивает. . .

Но у тебя ушло на это 4 часа? :crying_cat_face:

Спасибо ещё раз, Дэвид. Я очень ценю твою поддержку.

В этот раз не повезло, иногда везёт ;). В этот раз я прочитал руководство Дэвида и обратил внимание на отличие в коде, которому я изначально следовал.

Но конечно, некоторые проблемы решаются после прогулки в местном парке на следующий день :deciduous_tree:

Кстати, если я публикую руководство по какой-то теме, то обычно это потому, что сам потратил много часов или даже дней, пытаясь разобраться в этом :sweat_smile:. Всё это про Zeitwerk точно попадает в эту категорию!

:100: :chefs_kiss:

Принято. Я читаю все ваши посты, когда они появляются. Мне следовало поискать только «zeitwork», и, возможно, я бы его нашёл. Но даже в этом случае проблема заключалась буквально в одном слове, которое казалось таким безобидным.

Теперь я пытаюсь преобразовать все свои конструкции {{blah... в <blah... . Это меня доканывает. Но я думаю, что понимаю это (достаточно хорошо, чтобы сделать это, возможно, ещё через несколько дней).