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設定が無効になっていないか?