5
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?

More than 1 year has passed since last update.

Ruby開発Advent Calendar 2023

Day 5

RailsでHTTP OPTIONSリクエストをルーティングする

Posted at

最近rails routesを実行したときに、見慣れないHTTP OPTIONSリクエストのルーティングを目にしたので調べました。

よくあるルーティング

Railsではresourcesメソッドを使うことで、あるリソースを操作するコントローラの各アクションにリクエストをマッピングできます。

Rails.application.routes.draw do
  resources :products
end

resourcesメソッドでは GETPOSTPATCHPUTDELETEリクエストに対するルーティングは作成されますが、OPTIONSメソッドのようにリソースを操作しないリクエストのルーティングは作成されません。

OPTIONSメソッドとは

HTTP の OPTIONSメソッドは、指定された URL またはサーバーの許可されている通信オプションをリクエストします。

レスポンスには、許可されているメソッドを含んだ Allow ヘッダーが入ります。

> curl -X OPTIONS https://example.org -i
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)

CORS では、プリフライトリクエストを OPTIONS メソッドで送信すると、サーバーはリクエストを送信して受け付けられるかどうかを応答できるようにします。

CORSリクエスト前のプリフライトリクエスト以外にも、APIのリクエスト/レスポンスのJSON schemaを公開するために使用するケースもあるようです。

OPTIONSリクエストをルーティングする方法

matchメソッドと:viaオプションを使うことでOPTIONSリクエストにマッチするルーティングを作成できます。

match '/products/:id', to: 'products#option', via: :options
OPTIONS /products/:id(.:format)    products#option

リソースベースのルーティングにOPTIONSリクエストのルーティングを追加するときは、collectionやmemberブロック内に記述します。

Rails.application.routes.draw do
  resources :products do
    collection do
      match '', via: :options, action: :option
    end
  end
end

追加されるルーティングは以下のようになります。

OPTIONS    /products(.:format)    products#option

参考

https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#simple_requests
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/OPTIONS

5
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
5
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?