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}' \
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        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 个赞

您看过这个话题吗?如果您遵循那里的结构(以及插件骨架中的结构),事情应该会很顺利:

Zeitwerk 自动加载的一个重要部分是文件名/路径,因此很难从您共享的代码片段中找出问题所在。这是在 plugin.rb 文件中吗?还是其他文件?

2 个赞

抱歉。那是 config/routes.rb

但我也有 . . . 一些 . . . 在 lib/discourse-pfaffmanager/engine.rb 中,所以也许我需要 routes.rb 中的内容移到 lib/pfaffmanager/engine.rb 中。 再读一遍手册。

1 个赞

我认为你可能需要做这个更改:

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

这样,文件就可以被“重新加载”多次而不会引起冲突。(“draw”会替换任何现有路由,而“append”在发生冲突时会引发错误)

这也会使其与当前的插件骨架匹配:

3 个赞

搞定了!

弄明白了之后总是显而易见。

非常感谢。

(现在如果我能让 vscode 在保存文件时进行 linting,但至少它现在可以在本地进行,然后再推送到 github…)

1 个赞

是的,这正是我最近做的一个更改。

3 个赞

这让我感觉好多了……

但你花了 4 个小时吗? :crying_cat_face:

再次感谢,David。我真的很感激你的支持。

2 个赞

这次不行,有时你会很幸运;)。这次我碰巧读了 David 的指南,并注意到与我最初遵循的代码有所不同。

但当然,有些问题需要第二天去当地公园散步来解决 :deciduous_tree:

1 个赞

供参考,如果我发布关于某事的指南,通常是因为我花了很多时间/天来自己弄清楚 :sweat_smile:。所有这些 Zeitwerk 的东西都属于这一类!

:100: :chefs_kiss:

知道了。你发的时候我都会吃掉。我应该只搜索 zeitwork,也许就能找到了。但即便如此,问题也仅仅是一个看似无害的词。

现在我正试图把我所有的 {{blah... 东西都改成 \u003cblah... 。这太折磨人了。但我想我(也许几天后就能)理解了。

2 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。