カテゴリ: Rails 更新日: 2026/02/04

Railsのよくあるエラーを解決!AbstractController::ActionNotFoundとInvalidAuthenticityTokenの原因と対処法

よくあるエラー解決集:AbstractController::ActionNotFound/InvalidAuthenticityToken
よくあるエラー解決集:AbstractController::ActionNotFound/InvalidAuthenticityToken

先生と生徒の会話形式で理解しよう

生徒

「Railsでボタンをクリックしたら、変なエラーが出ちゃいました。ActionNotFoundとかAuthenticityTokenって何なんですか?」

先生

「それはRailsでよくあるエラーですね。ちゃんと原因と対処法を知れば、怖くありませんよ。」

生徒

「どうやったら直せるんですか?初心者でもわかるように教えてください!」

先生

「もちろんです。ひとつひとつ丁寧に見ていきましょう。」

1. Railsでよく出るエラーとは?

1. Railsでよく出るエラーとは?
1. Railsでよく出るエラーとは?

Ruby on Rails(ルビーオンレイルズ)を使っていると、エラー画面に突然「ActionNotFound」や「InvalidAuthenticityToken」といった英語のエラーメッセージが表示されることがあります。

これらは初心者がつまずきやすいコントローラ関連のエラーで、原因を理解しておくと今後の開発がグッと楽になります。

2. AbstractController::ActionNotFoundとは?

2. AbstractController::ActionNotFoundとは?
2. AbstractController::ActionNotFoundとは?

「AbstractController::ActionNotFound(アブストラクト・コントローラ・アクション・ノットファウンド)」とは、指定されたアクションがコントローラに定義されていないときに表示されるエラーです。

アクションとは、コントローラの中で処理の内容を書く部分のことです。たとえば、showindexなどです。

このエラーが出るときは、次のようなコードが原因かもしれません。


# ルーティングでshowアクションを指定している
get '/posts/:id', to: 'posts#show'

# しかし、PostsControllerにshowアクションがない
class PostsController < ApplicationController
  def index
    # 一覧を表示する処理
  end
end

このように、ルーティングではshowアクションを呼び出そうとしているのに、そのアクションが存在しないとエラーになります。

3. ActionNotFoundの対処法

3. ActionNotFoundの対処法
3. ActionNotFoundの対処法

対処方法はとてもシンプルです。エラーに書かれているアクション名が、コントローラに存在するかを確認しましょう。


class PostsController < ApplicationController
  def show
    @post = Post.find(params[:id])
  end
end

これで、ルーティングとアクションの整合性がとれ、エラーが解消されます。

4. InvalidAuthenticityTokenとは?

4. InvalidAuthenticityTokenとは?
4. InvalidAuthenticityTokenとは?

「InvalidAuthenticityToken(インバリッド・オーセンティシティ・トークン)」は、フォームを送信したときにセキュリティチェックが通らなかったときに出るエラーです。

RailsではCSRF(クロスサイトリクエストフォージェリ)対策として、フォームに「正しいトークン」が含まれているかチェックしています。これは悪意のある攻撃からアプリケーションを守るための仕組みです。

ですが、以下のような場合にこのエラーが出ることがあります。

  • フォームタグにcsrf_meta_tagsが含まれていない
  • JavaScriptでAjax送信する際にトークンを含め忘れた
  • セッションが切れてしまっている(長時間放置など)

5. InvalidAuthenticityTokenの対処法

5. InvalidAuthenticityTokenの対処法
5. InvalidAuthenticityTokenの対処法

以下の対処法を確認してください。

① フォームにCSRFトークンを含める

Railsのform_withform_forを使えば、自動でトークンが挿入されます。


<%= form_with model: @post do |f| %>
  <%= f.text_field :title %>
  <%= f.submit %>
<% end %>

② HTMLにcsrf_meta_tagsを入れる

app/views/layouts/application.html.erbに次のように書かれているか確認しましょう。


<head>
  <%= csrf_meta_tags %>
</head>

③ JavaScriptで送信する場合

Ajaxなどで送信する場合は、トークンをヘッダーに含める必要があります。


const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
fetch('/posts', {
  method: 'POST',
  headers: {
    'X-CSRF-Token': token,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ title: '新しい投稿' })
});

6. テスト環境やAPIモードでの注意点

6. テスト環境やAPIモードでの注意点
6. テスト環境やAPIモードでの注意点

RailsのAPIモードRSpecのテスト環境では、CSRFチェックが無効になっていることがあります。

そのため、開発環境では動いていたのに、本番環境ではInvalidAuthenticityTokenが出る…というケースも少なくありません。

本番と開発の挙動の違いにも注意しましょう。

7. それでも直らないときのチェックポイント

7. それでも直らないときのチェックポイント
7. それでも直らないときのチェックポイント

以下のチェックリストを活用して、エラー解消につなげましょう。

  • アクション名が正しく、ルーティングと一致しているか?
  • コントローラ名とアクション名のスペルミスはないか?
  • csrf_meta_tagsがHTMLに含まれているか?
  • セッションが切れていないか(時間経過)?
  • ブラウザのCookie設定が無効になっていないか?

まとめ

まとめ
まとめ

Ruby on Railsでの開発において、エラーは避けて通れない道ですが、その中でも今回ご紹介した「AbstractController::ActionNotFound」と「ActionController::InvalidAuthenticityToken」は、特に初心者が直面しやすい壁と言えます。しかし、それぞれの原因を紐解いていけば、決して難しい問題ではありません。

ActionNotFoundを克服するためのポイント

ActionNotFoundは、端的に言えば「道案内(ルーティング)はあるけれど、目的地(アクション)が見つからない」という状態です。開発中にこのエラーが出た場合は、まずconfig/routes.rbで定義したアクション名と、コントローラ内に記述したメソッド名が完全に一致しているかを疑いましょう。

例えば、データベースからユーザー一覧を取得するような処理を実装する場合、以下のようなテーブル構造とコードの不一致が原因になることが多々あります。


id | name     | email              | created_at
---+----------+--------------------+--------------------
1  | 佐藤健太 | sato@example.com   | 2026-01-10 10:00:00
2  | 鈴木愛   | ai_s@example.com   | 2026-01-11 11:30:00
3  | 田中直樹 | tanaka@example.com | 2026-01-12 09:15:00
4  | 高橋美紀 | miki@example.com   | 2026-01-13 15:45:00
5  | 伊藤修   | osamu@example.com  | 2026-01-14 12:00:00

このデータを表示しようとした際、ルーティングで index アクションを指定しているのに、コントローラ側で list という名前にしてしまっているとエラーになります。


# config/routes.rb
get 'users', to: 'users#index'

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def list # 本来は index にすべき
    @users = User.all
  end
end

このように名前がズレているだけでRailsは迷子になってしまいます。一文字のタイポ(打ち間違い)がないか、慎重に確認することが大切です。

InvalidAuthenticityTokenを理解してセキュリティを強化

一方で、InvalidAuthenticityTokenはRailsが標準で備えている強力なセキュリティ機能「CSRF対策」が正しく動作している証拠でもあります。外部の悪意あるサイトから勝手にフォームを送信されるのを防ぐために、Railsは「秘密の合言葉(トークン)」を照合しています。

このエラーが出た時は、ブラウザのキャッシュが古い、セッションがタイムアウトした、あるいはJavaScriptで通信する際にトークンを渡し忘れているといったことが考えられます。

データベース操作時の注意と実践

実際にデータベースを操作するSQL文を発行する際も、これらのエラーは関連してきます。例えば、特定のユーザー情報を更新しようとした時にトークンエラーが出ると、更新処理(UPDATE文)自体が実行されません。

正常な処理の流れをSQLで確認してみましょう。


id | name     | age | role
---+----------+-----+-------
1  | 佐藤健太 | 28  | admin
2  | 鈴木愛   | 24  | user
3  | 田中直樹 | 32  | user
4  | 高橋美紀 | 21  | user

-- ID 3の田中さんの年齢を更新するSQL
UPDATE users
SET age = 33, updated_at = NOW()
WHERE id = 3;

id | name     | age | role
---+----------+-----+-------
1  | 佐藤健太 | 28  | admin
2  | 鈴木愛   | 24  | user
3  | 田中直樹 | 33  | user
4  | 高橋美紀 | 21  | user

RailsではこれらのSQLが裏側で自動発行されますが、その手前のコントローラやセキュリティチェックで止まってしまうと、データベースの中身は一切変わりません。

エラー解決の秘訣は、画面に表示されたメッセージを読み飛ばさず、「どのファイルの何行目で、何が足りないと言われているのか」を客観的に観察することです。Railsの親切なエラー画面は、あなたを困らせるためではなく、助けるために存在しています。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!ActionNotFoundが出たときは、まず自分の書いたコントローラのメソッド名を確認すればいいんですね。さっき試したら、単純なスペルミスを見つけました!」

先生

「素晴らしいですね。プログラミングにおいて、タイポはプロでもよくやるミスです。エラーメッセージは『ここを直してね』というRailsからのラブレターだと思って向き合うといいですよ。」

生徒

「ラブレターですか(笑)。でも、InvalidAuthenticityTokenの方は少し難しそうです。セキュリティの話が絡むと、どうしても複雑に感じてしまって…。」

先生

「確かにセキュリティは奥が深いですが、基本は『正規のルートでページを表示して、そこにあるボタンを押したか』をRailsがチェックしてくれているだけなんです。もしフォームを自作したり、Ajaxを使ったりする時は、トークンを明示的に送る必要があることを覚えておいてください。」

生徒

「なるほど。Railsが勝手に守ってくれているからこそのエラーなんですね。そう考えると、エラーが出ること自体は悪いことじゃない気がしてきました!」

先生

「その通りです!エラーを一つ解決するたびに、あなたはRailsの仕組みに詳しくなっています。データベースの更新が反映されない時も、SQLのログを見ればどこで止まっているか一目瞭然ですから、怖がらずにデバッグを楽しんでいきましょう。」

生徒

「はい!次からはエラー画面をしっかり読んで、Railsと対話しながら開発を進めてみます!」

関連記事:
カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.7
Java&Spring記事人気No7
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説