Railsのよくあるエラーを解決!AbstractController::ActionNotFoundとInvalidAuthenticityTokenの原因と対処法
生徒
「Railsでボタンをクリックしたら、変なエラーが出ちゃいました。ActionNotFoundとかAuthenticityTokenって何なんですか?」
先生
「それはRailsでよくあるエラーですね。ちゃんと原因と対処法を知れば、怖くありませんよ。」
生徒
「どうやったら直せるんですか?初心者でもわかるように教えてください!」
先生
「もちろんです。ひとつひとつ丁寧に見ていきましょう。」
1. Railsでよく出るエラーとは?
Ruby on Rails(ルビーオンレイルズ)を使っていると、エラー画面に突然「ActionNotFound」や「InvalidAuthenticityToken」といった英語のエラーメッセージが表示されることがあります。
これらは初心者がつまずきやすいコントローラ関連のエラーで、原因を理解しておくと今後の開発がグッと楽になります。
2. AbstractController::ActionNotFoundとは?
「AbstractController::ActionNotFound(アブストラクト・コントローラ・アクション・ノットファウンド)」とは、指定されたアクションがコントローラに定義されていないときに表示されるエラーです。
アクションとは、コントローラの中で処理の内容を書く部分のことです。たとえば、showやindexなどです。
このエラーが出るときは、次のようなコードが原因かもしれません。
# ルーティングでshowアクションを指定している
get '/posts/:id', to: 'posts#show'
# しかし、PostsControllerにshowアクションがない
class PostsController < ApplicationController
def index
# 一覧を表示する処理
end
end
このように、ルーティングではshowアクションを呼び出そうとしているのに、そのアクションが存在しないとエラーになります。
3. ActionNotFoundの対処法
対処方法はとてもシンプルです。エラーに書かれているアクション名が、コントローラに存在するかを確認しましょう。
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
end
end
これで、ルーティングとアクションの整合性がとれ、エラーが解消されます。
4. InvalidAuthenticityTokenとは?
「InvalidAuthenticityToken(インバリッド・オーセンティシティ・トークン)」は、フォームを送信したときにセキュリティチェックが通らなかったときに出るエラーです。
RailsではCSRF(クロスサイトリクエストフォージェリ)対策として、フォームに「正しいトークン」が含まれているかチェックしています。これは悪意のある攻撃からアプリケーションを守るための仕組みです。
ですが、以下のような場合にこのエラーが出ることがあります。
- フォームタグに
csrf_meta_tagsが含まれていない - JavaScriptでAjax送信する際にトークンを含め忘れた
- セッションが切れてしまっている(長時間放置など)
5. InvalidAuthenticityTokenの対処法
以下の対処法を確認してください。
① フォームにCSRFトークンを含める
Railsのform_withやform_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モードでの注意点
RailsのAPIモードやRSpecのテスト環境では、CSRFチェックが無効になっていることがあります。
そのため、開発環境では動いていたのに、本番環境ではInvalidAuthenticityTokenが出る…というケースも少なくありません。
本番と開発の挙動の違いにも注意しましょう。
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と対話しながら開発を進めてみます!」