Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1に入る主要な機能まとめ(2)error_highlight対応、routes --grepほか(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。原文の目次は省略しました。また、週刊Railsウォッチの該当項目へのリンクも追加してあります。

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エラーが発生します。

参考: 週刊Railsウォッチ20220822
参考: 週刊Railsウォッチ20220829

02. 🔗 メーラーでプレビューパスを複数指定可能になる

この変更によって、エンジンのメールをプレビュー可能になりました(#31595)。メーラーのプレビューを探索する場所を1箇所しか設定できない config.action_mailer.preview_pathが廃止され、探索パスを複数追加できるconfig.action_mailer.preview_pathsが追加されました。

config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"

参考: 週刊Railsウォッチ20220829

03. 🔗 error_highlight gemで行内のエラー発生位置も示されるようになった

Ruby 3.1で追加されたerror_highlight gemは、エラー発生時に詳細な発生位置を表示します。Railsでこのerror_highlight gemを用いて、エラーページでエラーの発生した範囲をハイライト表示するようになりました(#45818)。

ruby/error_highlight - GitHub

参考: 週刊Railsウォッチ20220920

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

参考: 週刊Railsウォッチ20220920

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}
    )

参考: 週刊Railsウォッチ20220926

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

参考: 週刊Railsウォッチ20220926

07. 🔗 Action Viewのinstrumentationに:localsが追加

ActiveSupport::Notificationsが、:identifier:layoutに加えて:localsもキャプチャできるようになりました(#45977)。この変更の動機は、テスト中のアサーションをより厳密に書くために、レンダリング処理についてさらに深い洞察を得ることです。また、APM(アプリケーションパフォーマンス監視)でも有用でしょう。

参考: 週刊Railsウォッチ20221003

08. 🔗 Rails.error.reportがエラーを'reported'とマーキングするようになった

#46131はどちらかというとバグ修正かもしれませんが、いずれにしろ私の中では嬉しいマージであることに変わりありません。Rails.error.reportが更新されてエラーを'reported'とマーキングするようになったことで、同じエラーが何度も出力されないようになりました。これは、エラーを上位に伝達する前にエラーレポートにコンテキスト情報を追加したい場合や、実行コンテキストの外でエラーを安全にキャッチしてレポートする必要がある場合などに便利です。

参考: 週刊Railsウォッチ20221018

09. ActionController::Parametersexclude?メソッドが追加された

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

参考: 週刊Railsウォッチ20221011

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"

参考: 週刊Railsウォッチ20221011

訳注

dom_idについては以下の記事もどうぞ。

Rails: Action Viewのdom_idヘルパーは実は有能(翻訳)

11. 🔗 QueryLogstags_formatを設定可能になった

ActiveRecord::QueryLogstags_formatオプションが新たに導入されました(#45081)。tags_formatオプションを指定することで、クエリログでキーバリューペアの区切り記号や引用符のスタイルをユーザーがカスタマイズできるようになります。デフォルトではコロン(:)が区切り記号で、値は引用符で囲まれません。しかし、sqlcommenter gemで使われている=のような別の区切り記号を使いたいこともあります。tags_formatオプションにデフォルトの振る舞いと:sqlcommenterに対応するシンボルを設定することで、両者のいずれかのスタイルを選択できるようになります。

参考: 週刊Railsウォッチ20221018

12. 🔗 database.ymlのYAMLキーに任意のERBを書けるようになった

DummyCompilerERB::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 %>

参考: 週刊Railsウォッチ20221018

13. 🔗 ERBテンプレート内のエラー発生位置が詳しくハイライト表示されるようになった

ERBテンプレート内で発生した例外の詳細な発生位置情報がハイライト表示されるようになりました(#46171)。これは上述の03を元に構築されています。これによって、以下のようにエラー箇所がわかりやすくハイライトされるようになりました。

参考: 週刊Railsウォッチ20221018


パート2は以上です!パート3では25件ほどの機能をご紹介する予定です。皆さんはどの機能がお気に入りですか?よろしければ原文末尾のコメント欄にてお知らせください。

次回もご期待ください。

関連記事

Rails 7.1に入る主要な機能まとめ(1)update_attribute!、CTEサポートほか(翻訳)

Rails 7.1に入る主要な機能まとめ(3)Docker関連ファイル導入ほか(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。