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': 無効なルート名、既に使用されています: 'pfaffmana
ger'  (ArgumentError)                                                                                                                                                                         
同じ名前のルートを `:as` オプションを使用して2つ定義したか、リソースによって既に定義されているルートを上書きしている可能性があります。後者の場合、`resources` で作成されたルートを制限できます。詳細は以下をご覧ください:                                                                                                                                     
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

このトピックを見ましたか?もしそこで(そしてプラグインスケルトンで)構造に従えば、かなりスムーズに進むはずです。

Zeitwerkオートローディングの重要な部分はそのファイル名/パスなので、共有されたスニペットから問題を特定するのは困難です。それはplugin.rbファイルにありますか?それとも他のファイルですか?

「いいね!」 2

すみません。それは config/routes.rb です。

しかし、lib/discourse-pfaffmanager/engine.rb にも . . . stuff . . . があるので、おそらく routes.rb から lib/pfaffmanager/engine.rb に stuff を移動する必要があるかもしれません。RTFM をもっと読む必要があります。

「いいね!」 1

この変更を行う必要があると思います。

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

これにより、ファイルが複数回「リロード」されても競合が発生しなくなります。(‘draw’ は既存のルートを置き換えますが、‘append’ は競合があった場合にエラーを発生させます)

これにより、現在の plugin-skeleton にも一致するようになります。

「いいね!」 3

うまくいきました!

解決するといつも明白になりますね。

本当にありがとうございます。

(これで、ファイルを保存したときにvscodeでリンティングができるようになればいいのですが、少なくともgithubにプッシュする前にローカルで実行されるようになりました。。。)

「いいね!」 1

はい、それはまさに私が最近行った変更です。

「いいね!」 3

それで少し気が楽になりました。

しかし、4時間かかりましたか? :crying_cat_face:

改めて、Davidさん、サポートに感謝します。

「いいね!」 2

今回は違います。時には運が良いこともあります :wink: 。今回はたまたまデイビッドのガイドを読んで、私が元々従っていたコードとの違いに気づきました。

でも、確かに、いくつか問題は翌日に公園を散歩して解決するようなものです :deciduous_tree:

「いいね!」 1

参考までに、私が何かについてのガイドを投稿する場合、それは通常、自分で解決しようとして何時間も/何日も無駄にしたからです :sweat_smile: 。このZeitwerk関連のものはすべて、まさにそのカテゴリに当てはまります!

:100: :chefs_kiss:

承知いたしました。投稿されるものはすべて食べます。zeitworkだけで検索すれば見つかったかもしれません。しかし、問題は、無害に見えるたった1つの単語でした。

今、私はすべての {{blah... \u003cblah... に変更しようとしています。気が狂いそうです。しかし、(おそらく数日後にはできるようになるくらいには)理解できたと思います。

「いいね!」 2

このトピックは、最後の返信から30日後に自動的にクローズされました。新しい返信は許可されていません。