0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

非同期リクエスト時の`AbstractController::ActionNotFound`エラーについて

Last updated at Posted at 2024-02-26

エラーの背景

あるRailsプロジェクトで、ユーザーがチェックボックスをクリックすると、選択された曜日に応じてビジネス時間を動的に更新する機能を実装しようとしました。この非同期通信のために、JavaScriptのfetch APIを使用して/companies/update_business_hoursエンドポイントに対してPOSTリクエストを送信しました。しかし、リクエストを送信した際に次のエラーが発生しました。

AbstractController::ActionNotFound at /companies/update_business_hours
======================================================================
The action 'update_business_hours' could not be found for CompaniesController

エラーの原因

'update_business_hours'メソッドを'public'ではなく、'private'や'protected'メソッドとしており、コントローラ内のメソッドからアクセスできなくなっていたため。

JavaScriptからの非同期リクエスト

JavaScript(例えば、fetch APIを使用)からRailsのコントローラに非同期リクエストを送信する場合、リクエストはpublicメソッド(アクション)に対してのみ行うことができます。privateprotectedメソッドは、外部からのリクエストに対して直接アクセス可能なアクションとして使用することはできません。

fetch('/articles', {
  method: 'GET'
}).then(response => response.json())
  .then(data => console.log(data));

上記の例では、/articlesエンドポイントに対してGETリクエストを送信しており、これはArticlesControllerindexアクション(publicメソッド)にルーティングされます。

(補足)各メソッドについて

Publicメソッド

Railsコントローラのpublicメソッドは、HTTPリクエストを通じて外部から呼び出すことができるアクションとして機能します。これらは、アプリケーションのルーティング設定に基づいて、外部から直接アクセス可能です。

class ArticlesController < ApplicationController
  # 外部からアクセス可能なアクション
  def index
    @articles = Article.all
  end
end

Privateメソッド

privateメソッドは、コントローラの内部でのみ使用され、外部から直接アクセスすることはできません。これらは、主にヘルパーメソッドやフィルターなど、コントローラ内の他のアクションからのみ呼び出されるメソッドとして使用されます。

class ArticlesController < ApplicationController
  private

  # 内部でのみ使用されるヘルパーメソッド
  def set_article
    @article = Article.find(params[:id])
  end
end

Protectedメソッド

protectedメソッドはRailsのコントローラにおいて一般的ではありませんが、これらも外部から直接アクセスすることはできません。protectedメソッドは、同じクラスまたはサブクラスのインスタンスからのみアクセス可能です。

まとめ

Railsコントローラのメソッド可視性は、アクションのアクセス制御に重要な役割を果たします。JavaScriptからの非同期リクエストを含む、外部からのHTTPリクエストは、publicメソッドに対してのみ行うことができます。privateprotectedメソッドは、コントローラの内部ロジックのために保護されています。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?