アプリケーションにDockerfileが!? Rails 7.1の新機能について
本連載の締めくくりとして、近くリリースが予定されているRails 7.1の新機能のうち、フロントエンド開発に関連するかは別として、筆者が個人的に注目しているものを抜粋して簡単に紹介することにします。
アプリケーションにDockerfileを生成する
Railsアプリケーションの作成時に、既定でDockerfileなどが含まれるようになります。Dockerfileが用意されることで、Dockerコンテナイメージの作成が容易になり、コンテナへのアプリケーションデプロイ時の利便性が向上します。
具体的には、以下のファイルが作成されます。
- Dockerfile
- .dockerignore
- bin/docker-entrypoint
これらのファイルは、アプリケーションをproduction環境にデプロイする場合を意図しており、development環境で使用すべきではありません。そのため、Dockerfileなどが不要な場合は、--skip-dockerオプションで追加をスキップできます。
DockerコンテナのためのDocked Rails CLIが追加される
Docked Rails CLIが追加されることで、DockerコンテナにおけるRailsアプリケーションのインストールやセットアップが容易になります。具体的には、以下のコマンドを実行することで、railsコマンドに前置きできるdockedコマンドがエイリアスとして定義されます。
% docker volume create docker-volume % alias docked='docker run --rm -it -v ${PWD}:/rails -v docker-volume:/bundle -p 3000:3000 ghcr.io/rails/cli'
このあと、以下のようにRailsアプリケーションをDockerコンテナ上に作成、Scaffolding、マイグレーション、実行できます。
% docked rails new rails-app % cd rails-app % docked rails generate scaffold message title:string body:text % docked rails db:migrate % docked rails s
エラー発生位置が細かくハイライト表示される
Ruby 3.1でサポートされたgemであるerror_highlightを使って、コード中のエラー発生位置が細かくハイライト表示されるようになります。これで、コードのどこでエラーが発生しているのかが分かりやすくなります。
error_highlightを使っていないRails 7.0のエラー表示では、エラーのある行全体がハイライト表示されていました。長いコードだと、どのへんに問題があるのか分かりにくいと筆者も感じていましたが、error_highlightによってエラーのある範囲が細かくハイライト表示されますので、エラーの特定が容易になります。
一見地味ですが、Railsの開発に慣れていない段階だと非常にありがたい機能と思えます。
Active RecordでCTE(Common Table Expression)がサポートされる
Common Table Expressionとは共通テーブル表現とも呼ばれ、SQL文の記述を簡略化するための記法です。具体的には、WITH文を使ってSELECT文などのクエリに名前を付けておき、それを他のクエリから参照して実行できます。FROM句に続ける一時テーブルや、WHERE句に続けるサブクエリをCTEを使って記述すると一つのSQL文が長くなってしまうのをある程度防げます。ネストされたクエリも別のSQL文に切り離せるので、可読性もアップします。
Rails 7.1では、このCTEをモデルのwithメソッドによってシンプルに記述できるようになります。例えば、以下のwithメソッドでは2つのサブクエリを実行した結果を最終的な結果として受け取るクエリを簡単に記述できます。
Message.with( messages_with_replies: Message.where("replies_count > ?", 0), messages_with_tags: Message.where("tags_count > ?", 0) )
これは、以下のようなSQL文になります。
WITH messages_with_replies AS ( SELECT * FROM messages WHERE (replies_count > 0) ), messages_with_tags AS ( SELECT * FROM messages WHERE (tags_count > 0) ) SELECT * FROM messages
Active Recordでは、内部的な処理にArelというSQL処理のためのライブラリが使われています。このArelを直接使うと同等の処理の記述が可能ですが、かなり冗長なものになるのが難点です。withメソッドによってコードとSQLの対応がシンプルかつ直感的になって、意図するSQLをより生成しやすくなります。
まとめ
今回は第8回の続きとして、Action Cableによるチャットルームアプリのメッセージ保存版の開発と、近々にリリースが予定されているRails 7.1の新機能の一部を紹介しました。
今回を以て、Railsによるクライアントサイド開発の連載は終了です。Railsが、サーバサイドアプリケーションにとどまらずクライアントサイドまで含めたフルスタックのアプリケーション開発に十分に対応できることをお伝えできたのではないかと思います。読者のRailsアプリ開発において本連載が少しでもお役に立てば幸いです。