Techioz Blog

Rails ルートが見つからないというエラーが発生することがありました

概要

Rails ルートで「見つからない」エラーが発生することがありますが、数秒後に自動的に解決されます。

undefined local variable or method owner_root_path' for #<Owner::SessionsController:0x00007f30408d46f0>
/myapp/app/controllers/owner/sessions_controller.rb:30:increate’
/ruby/2.5.0/gems/actionpack-5.1.6.2/lib/action_controller/metal/basic_implicit_render.rb:4:in send_action'
/ruby/2.5.0/gems/actionpack-5.1.6.2/lib/abstract_controller/base.rb:186:inprocess_action’

私のルート設定

# routes/owner.rb
Rails.application.routes.draw do
  constraints subdomain: /^owner/ do
    root to: "owner/top_pages#show", as: :owner_root
    ...
  end
end

# application.rb

config.paths["config/routes.rb"] = %w(
  config/routes/owner.rb
  config/routes.rb
).map {|relative_path| Rails.root.join(relative_path)}

なぜそれが起こったのか知っている人はいますか?

解決策

Rails 6.1 ガイドでは、大きなルート ファイルを小さなファイルに分割するために使用できる描画マクロが導入されました。これについては、ここで読むことができます: 非常に大きなルート ファイルを複数の小さなルート ファイルに分割する

お使いの Rails のバージョンがこのマクロをサポートしているかどうかはわかりません。そうでない場合は、ソースを使用して自分で描画メソッドを簡単に定義できます。それは次のようなものになります:

  def draw(routes_name)
    instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb")))
  end

追伸: このメソッド/マクロを導入したコミットを必ずチェックしてください。