Rails 7.1に入る機能まとめ(2)routes --grepほか(翻訳)
以下は本シリーズの他の回へのリンクです。
検索エンジンや記事紹介リンクで本記事にたどり着いた方へ: 本記事は、Rails 7.1に取り入れられるさまざまな機能を紹介する3回シリーズのパート2です。背景についてはRails 7.1に入る主要な機能まとめ(1)の「はじめに」をご覧ください。
最新の開発情報やヒントを常にキャッチしたい方は、元記事を下にスクロールしてRubyやRailsの最新情報を配信するニュースレターをぜひ購読してください。
01. 🔗 PostgreSQLのdrop_enum
がマイグレーションに追加
RailsにはPostgreSQL向けのcreate_enum
が追加されましたが、それに対応するdrop_enum
がありませんでした。今回、Railsのマイグレーションに#45735によってdrop_enum
が追加され、#45774によってdrop_enum
をリバース可能になりました。後者は、if_exists: true
オプションを指定するとenumが存在する場合にのみenumをDROPするようになります。enumが存在しない場合はActiveRecord::IrreversibleMigration
エラーが発生します。
02. 🔗 メーラーでプレビューパスを複数指定可能になる
この変更によって、エンジンのメールをプレビュー可能になりました(#31595)。メーラーのプレビューを探索する場所を1箇所しか設定できない config.action_mailer.preview_path
が廃止され、探索パスを複数追加できるconfig.action_mailer.preview_paths
が追加されました。
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
03. 🔗 error_highlight
gemで行内のエラー発生位置も示されるようになった
Ruby 3.1で追加されたerror_highlight gemは、エラー発生時に詳細な発生位置を表示します。Railsでこのerror_highlight gemを用いて、エラーページでエラーの発生した範囲をハイライト表示するようになりました(#45818)。
訳注
以下の記事も合わせてどうぞ。
04. 🔗 routes --grep
で特定のパスにマッチするルーティングを出力できるようになった
bin/rails routes --grep
を用いて、マッチするパスのみを表示できるようになりました(#45874)。$ bin/rails routes -g /cats/1
を実行すると以下のような結果が得られます。
Prefix Verb URI Pattern Controller#Action
cat GET /cats/:id(.:format) cats#show
PATCH /cats/:id(.:format) cats#update
PUT /cats/:id(.:format) cats#update
DELETE /cats/:id(.:format) cats#destroy
05. 🔗 ActiveRecord::QueryMethods#select
がハッシュを受け取れるようになった
テーブルをjoins
するときに以下のような生SQL文字列ではなくハッシュを書きたい場合に、select
でハッシュを指定できるようになりました(#45612)。
Post.joins(:comments)
.select(
"posts.id as post_id, posts.title as post_title,
comments.id as comment_id, comments.body as comment_body"
)
上は以下のように書けます。
Post.joins(:comments)
.select(
posts: { id: :post_id, title: :post_title },
comments: { id: :comment_id, body: :comment_body}
)
06. 🔗 Cache#fetch
のブロックでoptions
アクセサを渡せるようになった
fetch
メソッドにキャッシュのオプションを渡せるようになりました(#45905)。サードパーティの認証トークンを利用し、かつトークンをキャッシュに保存する場合は、このオプションを用いてキャッシュの有効期限をトークンの有効期限と同じに設定することで、キャッシュがサードパーティのトークンのTTLと一緒に失効するようにできます。
Rails.cache.fetch("3rd-party-token") do |name, options|
token = fetch_token_from_remote
# キャッシュのTTLをトークンのTTLに合わせて設定する
options.expires_in = token.expires_in
token
end
07. 🔗 Action Viewのinstrumentationに:locals
が追加
ActiveSupport::Notifications
が、:identifier
や:layout
に加えて:locals
もキャプチャできるようになりました(#45977)。この変更の動機は、テスト中のアサーションをより厳密に書くために、レンダリング処理についてさらに深い洞察を得ることです。また、APM(アプリケーションパフォーマンス監視)でも有用でしょう。
08. 🔗 Rails.error.report
がエラーを'reported'とマーキングするようになった
#46131はどちらかというとバグ修正かもしれませんが、いずれにしろ私の中では嬉しいマージであることに変わりありません。Rails.error.report
が更新されてエラーを'reported'とマーキングするようになったことで、同じエラーが何度も出力されないようになりました。これは、エラーを上位に伝達する前にエラーレポートにコンテキスト情報を追加したい場合や、実行コンテキストの外でエラーを安全にキャッチしてレポートする必要がある場合などに便利です。
09. ActionController::Parameters
にexclude?
メソッドが追加された
exclude?
メソッドが追加されたことで、ハッシュの整合性が少し向上しました(#45887)。Railsには以前からActionController::Parameters#include?
があるので、ActionController::Parameters#exclude?
もある方が自然です。新しいexclude?
メソッドは、パラメータに指定のキーがない場合にtrue
を返します。これは include?
とちょうど逆の動作です。
params = ActionController::Parameters.new(id: 1)
params.exclude?(:id) # => false
params.include?(:id) # => true
10. 🔗 dom_id
にクラスを直接渡せるようになった
new
を呼び出さずにdom_id
にクラスを直接渡せるようになりました(#46068)。これによってdom_id
の使用感がdom_class
に近くなり、文字列を生成するためだけにオブジェクトを新規作成せずに済むのでパフォーマンス向上にも役立ち、コードも短くなって効率がよくなります。
# 改修前
dom_id(Post)
# => NoMethodError: undefined method `to_key' for Post:Class
# 改修後
dom_id(Post)
# => "new_post"
11. 🔗 QueryLogs
でtags_format
を設定可能になった
ActiveRecord::QueryLogs
にtags_format
オプションが新たに導入されました(#45081)。tags_format
オプションを指定することで、クエリログでキーバリューペアの区切り記号や引用符のスタイルをユーザーがカスタマイズできるようになります。デフォルトではコロン(:
)が区切り記号で、値は引用符で囲まれません。しかし、sqlcommenter gemで使われている=
のような別の区切り記号を使いたいこともあります。tags_format
オプションにデフォルトの振る舞いと:sqlcommenter
に対応するシンボルを設定することで、両者のいずれかのスタイルを選択できるようになります。
12. 🔗 database.ymlのYAMLキーに任意のERBを書けるようになった
DummyCompiler
がERB::Compiler
に置き換えられました(#46134)。DummyCompiler
は、ユーザーがYAMLキーでERBを使おうとするとエラーになってしまいます。このプルリクによって、YAMLキーにERBを書けるようになりました。これと合わせて、Railsのconfig.active_record.suppress_multiple_database_warning
も非推奨化されました。
これで、以下のように書けるようになりました。
development:
<% 5.times do |i| %>
shard_<%= i %>:
database: db/development_shard_<%= i %>.sqlite3
adapter: sqlite3
<% end %>
13. 🔗 ERBテンプレート内のエラー発生位置が詳しくハイライト表示されるようになった
ERBテンプレート内で発生した例外の詳細な発生位置情報がハイライト表示されるようになりました(#46171)。これは上述の03を元に構築されています。これによって、以下のようにエラー箇所がわかりやすくハイライトされるようになりました。
パート2は以上です!パート3では25件ほどの機能をご紹介する予定です。皆さんはどの機能がお気に入りですか?よろしければ原文末尾のコメント欄にてお知らせください。
次回もご期待ください。
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。原文の目次は省略しました。また、週刊Railsウォッチの該当項目へのリンクも追加してあります。