1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Railsチュートリアル5章】help_pathでNameError → 原因は"資料を最後まで読んでなかった"

1
Posted at

はじめに

これは、Railsチュートリアル5章をやっていて、つまずいた名前付きルーティングのエラーの解決法と自分の失敗について載せている。
結論として、view側(_header.html.erb)のコードを以下のように書き換える。

app/views/layouts/_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

発生したエラー

  • エラーメッセージ全文
    スクリーンショット 2026-01-24 20.48.46.png
    NameErrorでundefined local variable or method 'help_path'と書かれており、未定義だから使えないと言われた。トホホ
  • エラーが発生した時に編集していた箇所
app/views/layouts/_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",   help_path %></li>
        <li><%= link_to "Log in",  "#" %></li>
      </ul>
    </nav>
  </div>
</header>

view側のルートパスを指定するところをhelp_pathと変更した際にエラーが起きた。

その時に書いていたroute.rbについて

config/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

自分が試したこと

  1. to: as: で明示的にルーティングを書いた

    Railsではルーティングを自分で設定していくことが可能だと知って、以下のように変更した。

    Rails.application.routes.draw do
      get '/help', to: 'static_pages#help', as: 'help'
    end
    

    始めの'/help'は、ブラウザでアクセスするときに使うURLパスでto:は処理を任せるコントロ
    ーラとアクションを記述して、as:でヘルパーメソッドの名前を決めるものとなっている。as:
    で指定した名前に_path_urlをつけて記述すると使えるようになる。

  2. Railsの名前付きルートについて調べた
    上記で書いたルーティングの使用について調べたら、get 'static_pages/help'のように記
    述すると、動的に/の部分を_に変えたヘルパーメソッドの名前に変えてくれるらしい。よっ
    て、pathurlを使う時にはstatic_pages_help_pathのように書き換えると使える

本当の原因

実はこんなに調べて格闘したのに、このエラーを解決したら後にRailsチュートリアルへ戻るとas:to:を使って、エラーを起こさずにルーティングしていた...
単純に自分が資料をしっかり最後まで読んでいなかったのが本当の原因でした!!!!

学んだこと

とりあえず全体像を一回見た上で進めてみること、そしてエラーなんかで詰まったら一旦先の資料まで目を通してみることが重要だなと再度感じた...
でも、今回のおかげでRailsのルーティングの仕組みについて知れた。

参考リンク

  • Railsガイド(ルーティング)ver8.1

  • Railsチュートリアル該当章

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?