はじめに
これは、Railsチュートリアル5章をやっていて、つまずいた名前付きルーティングのエラーの解決法と自分の失敗について載せている。
結論として、view側(_header.html.erb)のコードを以下のように書き換える。
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<%= link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", static_pages_help_path %></li>
<li><%= link_to "Log in", "#" %></li>
</ul>
</nav>
</div>
</header>
static_pages_help_pathのように前にstatic_pagesをつけるようにする。
もしくは、routes.rb で as: オプションを使って名前付きルートを明示的に定義する必要がある。
Rails.application.routes.draw do
get '/help', to: 'static_pages#help', as: 'help'
end
このように書くと、pathをhelp_pathと短い状態で扱えるようになる。
※ 私の場合、資料を最後まで読まずに手を動かしていたのが原因でした。同じ状況の方は、まず5章を最後まで読んでみてください。
環境
- Railsチュートリアルの第7版
- GitHub Codespaces
発生したエラー
- エラーメッセージ全文

NameErrorでundefined local variable or method 'help_path'と書かれており、未定義だから使えないと言われた。トホホ - エラーが発生した時に編集していた箇所
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<%= link_to "sample app", root_path, id: "logo" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<li><%= link_to "Log in", "#" %></li>
</ul>
</nav>
</div>
</header>
view側のルートパスを指定するところをhelp_pathと変更した際にエラーが起きた。
その時に書いていたroute.rbについて
Rails.application.routes.draw do
get 'static_pages/home'
get 'static_pages/help'
get 'static_pages/about'
get 'static_pages/contact'
root 'static_pages#home'
end
自分が試したこと
-
to:as:で明示的にルーティングを書いたRailsではルーティングを自分で設定していくことが可能だと知って、以下のように変更した。
Rails.application.routes.draw do get '/help', to: 'static_pages#help', as: 'help' end始めの
'/help'は、ブラウザでアクセスするときに使うURLパスでto:は処理を任せるコントロ
ーラとアクションを記述して、as:でヘルパーメソッドの名前を決めるものとなっている。as:
で指定した名前に_pathや_urlをつけて記述すると使えるようになる。 -
Railsの名前付きルートについて調べた
上記で書いたルーティングの使用について調べたら、get 'static_pages/help'のように記
述すると、動的に/の部分を_に変えたヘルパーメソッドの名前に変えてくれるらしい。よっ
て、pathやurlを使う時にはstatic_pages_help_pathのように書き換えると使える
本当の原因
実はこんなに調べて格闘したのに、このエラーを解決したら後にRailsチュートリアルへ戻るとas:やto:を使って、エラーを起こさずにルーティングしていた...
単純に自分が資料をしっかり最後まで読んでいなかったのが本当の原因でした!!!!
学んだこと
とりあえず全体像を一回見た上で進めてみること、そしてエラーなんかで詰まったら一旦先の資料まで目を通してみることが重要だなと再度感じた...
でも、今回のおかげでRailsのルーティングの仕組みについて知れた。
参考リンク
- Railsガイド(ルーティング)ver8.1
- Railsチュートリアル該当章