1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

統合テスト用の明示的な query: および body: キーワード引数、その他!

1
Posted at

統合テスト用の明示的な query: および body: キーワード引数、その他!

統合テストで as: :json を指定した GET リクエストを送る際、params: が URL のクエリ文字列になるのか、それともリクエストボディに含まれるのか、その挙動は非常に曖昧でした。これまでの Rails は X-Http-Method-Override を使って内部的に GET を POST に変換することで対処していましたが、そのせいで Rack::MethodOverride を除外している API 専用アプリが動かなくなるという副作用を抱えていました。

この問題を根本から解決するため、新たに query:body: という明示的なキーワードが導入されました。

get  "/search", query: { q: "rails" }, as: :json
post "/search", query: { page: 1 }, body: { filters: {} }, as: :json

query: は確実に URL のクエリ文字列へ、body: は確実にエンコードされたリクエストボディへと振り分けられます。従来の params: の挙動は維持されますが、これからはテストの意図をより正確にコードへ落とし込めるようになります。

また、ActionDispatch::Requestrequest.safe_method?request.unsafe_method? という述語メソッドが追加されました。RFC 9110 に準拠し、その HTTP メソッドが副作用を持たない「安全な」もの(GET, HEAD, OPTIONS, TRACE)かどうかを判定できます。マジック文字列による条件分岐を排除し、ロジックの見通しを良くしてくれます。

インフラ構成における「小さな、しかし厄介な問題」も修正されています。Action Cable のオリジンチェック (allow_same_origin_as_host) が、リバースプロキシ経由でも正しく動作するようになりました。これまではブラウザの Origin ヘッダーを生の HTTP_HOST と直接比較していたため、プロキシ背後で内部ホスト名が異なる場合にチェックが失敗していました。今回の修正で request.host_with_portrequest.ssl? を参照するようになり、Rails 本体の他のコンポーネントと一貫したホスト解決が保証されます。

さらに、ドキュメント面では「Layouts and Rendering」のガイドが全面的に刷新されました。コントローラーとビューがどのように連携するのかを軸に再構成され、他のガイドとの重複が整理されています。Rails を学び直したい、あるいは新人に教える際の強力なリソースになるはずです。

これらのアップデートは、テストの信頼性を高め、本番環境のネットワーク構成に起因する不整合を未然に防ぎます。明示的なキーワードへの書き換えには多少の工数がかかるかもしれませんが、リクエストの「意図」を曖昧にしない設計は、長期的なメンテナンス性を確実に引き上げてくれるはずです。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?