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

Rails 7.1.0 Action View CHANGELOG(翻訳)

概要

MITライセンスに基づいて翻訳・公開いたします。

参考: Action View の概要 - Railsガイド

rc1以後の更新はありません。

🔗 Action View CHANGELOG(v7.1.0.rc1)

🔗 Introduce ActionView::TestCase.register_parser by seanpdoyle · Pull Request #49194 · rails/rails

ActionView::TestCase.register_parserを導入。

register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }

test "renders RSS" do
  article = Article.create!(title: "Hello, world")

  render formats: :rss, partial: article

  assert_equal "Hello, world", rendered.rss.items.last.title
end

デフォルトでは、:htmlおよび:json用のパーサーが登録される。

Sean Doyle
同CHANGELOGより

🔗 Action View CHANGELOG(v7.1.0.beta1)

🔗 Fix: simple_format with blank wrapper_tag option returns plain html tag. by akhilgkrishnan · Pull Request #49120 · rails/rails

simple_formatに空のwrapper_tagオプションを渡すと素のHTMLタグが返される問題を修正。

デフォルトのsimple_formatは、<p>で囲んだテキストを返す。しかしwrapper_tag: nilオプションを指定すると<></>タグで囲まれたテキストが返されていた。

修正前:

simple_format("Hello World", {},  { wrapper_tag: nil })
# <>Hello World</>

修正後:

simple_format("Hello World", {},  { wrapper_tag: nil })
# <p>Hello World</p>

Akhil G Krishnan, Junichi Ito
同CHANGELOGより

参考: Rails API simple_format -- ActionView::Helpers::TextHelper

🔗 Don't double-encode nested field_id and field_name index by seanpdoyle · Pull Request #47436 · rails/rails

ネストしたfield_idfield_nameの添字の値を二重エンコードしないよう修正。

ビューのヘルパーメソッドfield_idfield_nameに、index: @optionsをデフォルトのキーワード引数として渡すようになった。

Sean Doyle
同CHANGELOGより

参考: 週刊Railsウォッチ20230802: ネストしたfield_idfield_nameの添字の値を二重エンコードしないようになった

🔗 Allow opting in/out of Link preload headers when calling stylesheet_link_tag or javascript_include_tag by ghiculescu · Pull Request #48553 · rails/rails

stylesheet_link_tagjavascript_include_tagの呼び出しでLink preloadヘッダーをオン/オフできるようになった。

# コンフィグで有効になっていてもヘッダーをオフにする
javascript_include_tag("http://example.com/all.js", preload_links_header: false)

# コンフィグで無効になっていてもヘッダーをオンにする
stylesheet_link_tag("http://example.com/all.js", preload_links_header: true)

Alex Ghiculescu
同CHANGELOGより

参考: 週刊Railsウォッチ20230802: Linkヘッダーのプリロードをオンオフできるようになった

🔗 Stop appending preload links once the head is already 1kB by casperisfine · Pull Request #48405 · rails/rails

プリロードが1KBに達したらLink preloadヘッダーの生成を止めるようになった。

一部のプロキシで巨大ヘッダーの処理に問題が生じているが、さらに重要なことは、Link preloadの効果は時とともに減少していくため、使いすぎは望ましくない。

より厳密な制御が必要な場合は、自動プリロード生成を無効にし、コントローラーやミドルウェアから手動でプリロードを生成することが推奨される。

Jean Boussier
同CHANGELOGより

🔗 Handle sanitize_options in simple_format helper by faraquet · Pull Request #48355 · rails/rails

simple_formatヘルパーで:sanitize_optionsを扱えるようになった。サニタイズに追加したい任意のオプションを追加できる。

変更前:

simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>")
# => "<p><a href=\"http://example.com\">Continue</a></p>"

変更後:

simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
# => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"

Andrei Andriichuk
同CHANGELOGより

参考: 週刊Railsウォッチ20230621: simple_format:sanitize_optionsが追加

🔗 Update Action View to use HTML5 standards-compliant sanitizers by flavorjones · Pull Request #48293 · rails/rails

HTML5標準に準拠したサニタイザのサポートが追加された。Rails 7.1ではデフォルトでRails::HTML5::Sanitizerが使われる(サポートされている場合)。

Action Viewで使うHTMLサニタイザは、config.action_view.sanitizer_vendorで設定可能。サポートされている値は以下のいずれか。

  • Rails::HTML4::Sanitizer
  • Rails::HTML5::Sanitizer

Rails 7.1では、サポートされている場合にこのコンフィグをRails::HTML5::Sanitizerに設定し、Rails::HTML4::Sanitizerにフォールバックする。従来のデフォルトはRails::HTML4::Sanitizer

Mike Dalessio
同CHANGELOGより

参考: 週刊Railsウォッチ20230621: Action Viewのサニタイザが更新されてHTML Living Standard(旧HTML5)準拠になった

🔗 Introduce config.dom_testing_default_html_version and use Rails::Dom::Testing to parse HTML in test helpers by flavorjones · Pull Request #48682 · rails/rails

ActionView::TestCase#document_root_elementで使われるHTMLパーサーが以下のコンフィグで制御されるようになった。

config.dom_testing_default_html_version

これにより、Rails::Dom::Testingのアサーションで使われるDOMが作成されるようになる。

Rails 7.1のデフォルト設定では、ブラウザのユーザーエージェントでDOM表示をより正確に表現できるHTML5パーサーが使われる(サポートされている場合)。従来は、このテストヘルパーで常にNokogiriのHTML4パーサーが使われていた。

Mike Dalessio
同CHANGELOGより

参考: 週刊Railsウォッチ20230823: config.dom_testing_default_html_versionが追加
参考: - config.dom_testing_default_html_version -- Rails アプリケーションを設定する - Railsガイド

🔗 Add a picture_tag helper by jpbalarini · Pull Request #48100 · rails/rails

HTMLのpictureタグのサポートが追加された。このタグにはString、Array、またはBlockを渡すことが可能。

imgタグに:imageキーを介して直接プロパティを渡せる。
pictureタグにはimgタグが必要なため、提供する最後の要素がimgタグに使われる。
ブロックを渡すことでpictureタグ全体を完全に制御することも可能。これにより、tag内のコンテンツが適切に設定される。

単一の画像ソースは以下のように指定できる。

<%= picture_tag("picture.webp") %>

上によって以下のHTMLが生成される。

<picture>
  <img src="/images/picture.webp" />
</picture>

複数の画像ソースは以下のように指定できる。

<%= picture_tag("picture.webp", "picture.png", :class => "mt-2", :image => { alt: "Image", class: "responsive-img" }) %>

上によって以下のHTMLが生成される。

<picture class="mt-2">
  <source srcset="/images/picture.webp" />
  <source srcset="/images/picture.png" />
  <img alt="Image" class="responsive-img" src="/images/picture.png" />
</picture>

以下のようにブロックを使うことで完全に制御できる。

<%= picture_tag(:class => "my-class") do %>
  <%= tag(:source, :srcset => image_path("picture.webp")) %>
  <%= tag(:source, :srcset => image_path("picture.png")) %>
  <%= image_tag("picture.png", :alt => "Image") %>
<% end %>

上によって以下のHTMLが生成される。

<picture class="my-class">
  <source srcset="/images/picture.webp" />
  <source srcset="/images/picture.png" />
  <img alt="Image" src="/images/picture.png" />
</picture>

Juan Pablo Balarini
同CHANGELOGより

参考: 週刊Railsウォッチ20230607: HTMLのpictureタグをサポート

🔗 Remove deprecated support to instance variables as locals to partials · rails/rails@8241178

インスタンス変数をlocalsとしてパーシャルに渡せる非推奨の振る舞いを削除。

Rafael Mendonça França
同CHANGELOGより

参考: 週刊Railsウォッチ20210222: render 'partial'でのインスタンス変数代入が非推奨化された

🔗 Remove deprecated constant ActionView::Path · rails/rails@23344d4

非推奨化されたActionView::Path定数を削除。

Rafael Mendonça França
同CHANGELOGより

🔗 token_list: Guard Stimulus' data-action from multiple escapes by seanpdoyle · Pull Request #47318 · rails/rails

token_listでHTMLエスケープが呼び出されすぎないよう保護。

Sean Doyle
同CHANGELOGより

参考: 週刊Railsウォッチ20230307: token_listヘルパーでStimulusのdata-actionを余分なエスケープから保護する

🔗 Allow f.select to be called with a single hash containing options and HTML options by ghiculescu · Pull Request #46629 · rails/rails

selectの呼び出しで、オプションとHTMLオプションを単一のハッシュに含めて渡せるようになった

以前は以下の書き方では動作しなかった。

<%= select :post, :author, authors, required: true %>

そのため、以下のように書く必要があった。

<%= select :post, :author, authors, {}, required: true %>

修正後は、HTMLのrequiredmultiplesize属性についてどちらの書き方も可能になった。

Alex Ghiculescu
同CHANGELOGより

参考: §3 セレクトボックスを簡単に作成する -- Action View フォームヘルパー - Railsガイド

🔗 Fix Issue #46677 by kryzhovnik · Pull Request #46678 · rails/rails

日時のフォームヘルパー(time_fielddate_fielddatetime_fieldweek_fieldmonth_field)の:valueオプションにTime/Date/DateTimeのインスタンスを渡せるようになった。

修正前:

<%= form.datetime_field :written_at, value: Time.current.strftime("%Y-%m-%dT%T") %>

修正後:

<%= form.datetime_field :written_at, value: Time.current %>

Andrey Samsonov
同CHANGELOGより

参考: Rails API ActionView::Helpers::FormHelper

🔗 Add support for HTML attributes of optgroups to select helper by cgunther · Pull Request #43019 · rails/rails

selectボックスの選択肢でグループ化またはネストしたコレクションを使う場合、オプションでHTML属性を子配列の最後の要素として含められるようになった。

<%= form.select :foo, [["North America", [["United States","US"],["Canada","CA"]], { disabled: "disabled" }]] %>

#=> <select><optgroup label="North America" disabled="disabled"><option value="US">United States</option><option value="CA">Canada</option></optgroup></select>

Chris Gunther
同CHANGELOGより

参考: #43019はRails 7.0.5に含まれています

🔗 Support checked as a keyword argument in check_box_tag and radio_button_tag by ghiculescu · Pull Request #45527 · rails/rails

check_box_tagradio_button_tagcheckedをキーワード引数として渡せるようになった。

FormHelper系のAPIとの一貫性を高めるため。checkedは位置引数としてもキーワード引数としても指定可能になった。

= check_box_tag "admin", "1", false
= check_box_tag "admin", "1", checked: false

= radio_button_tag 'favorite_color', 'maroon', false
= radio_button_tag 'favorite_color', 'maroon', checked: false

Alex Ghiculescu
同CHANGELOGより

参考: 週刊Railsウォッチ20221115: check_box_tagradio_button_tagchecked:キーワード引数が利用可能になった

🔗 [FIX #46021] Allow passing classes to dom_id by goulvench · Pull Request #46068 · rails/rails

dom_idにクラスを直接渡せるようになった。

今後はdom_idにクラスを渡すときにnewを呼ぶ必要はなくなる。
これにより、dom_idのこの振る舞いはdom_classに近くなる。
入力量が少なく済むのみならず、文字列を生成するためだけにRubyが新しいオブジェクト全体をインスタンス化せずに済むようになる。

変更前:

dom_id(Post) # => NoMethodError: undefined method `to_key' for Post:Class

変更後:

dom_id(Post) # => "new_post"

Goulven Champenois
同CHANGELOGより

参考: 週刊Railsウォッチ20221011: dom_idにクラスを渡せるようになった

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

🔗 Add :locals to ActionView rendering instrumentation by aarongough · Pull Request #45977 · rails/rails

Action Viewのrenderのinstrumentationで返されるデータに:localsも含まれるようになった。

変更前:

{
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
layout: "layouts/application"
}

変更後:

{
identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
layout: "layouts/application",
locals: {foo: "bar"}
}

Aaron Gough
同CHANGELOGより

参考: 週刊Railsウォッチ20221003: Action Viewレンダリングのinstrumentationが返すデータに:localsも出力可能になった

🔗 Replace rstrip with chomp!(break_sequence) in word_wrap by maxim · Pull Request #45942 · rails/rails

word_wrapにおけるbreak_sequence(改行シーケンス)の削除を最後に行うようになった。

これにより、印刷可能文字を含む改行シーケンスがword_wrapで正しく削除されないバグが修正される。

たとえば以下のテンプレートの出力は次のようになる。

# <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>

修正前:

# 11
# 22
#
# 33
# 44
#

修正後:

# 11
# 22
# 33
# 44

Max Chernyak
同CHANGELOGより

参考: Rails API word_wrap -- ActionView::Helpers::TextHelper

🔗 Allow templates to define which locals they accept by joelhawksley · Pull Request #45602 · rails/rails

テンプレートのlocalsを厳密に設定できるようになった。

デフォルトでは、任意のlocalsをキーワード引数として渡せる。
テンプレートが受け取るべきlocalsを定義するには、以下のようにlocalsをマジックコメントの形で追加する。

<%# locals: (message:) -%>
<%= message %>

以下のようにデフォルト値も指定できる。

<%# locals: (message: "Hello, world!") -%>
<%= message %>

以下のように書くとlocalsを完全に無効にできる。

<%# locals: () %>

Joel Hawksley
同CHANGELOGより

参考: 週刊Railsウォッチ20220822: テンプレートが受け取れるローカル変数をマジックコメントで定義可能になった

🔗 Add include_seconds option to datetime_local_field. by morgoth · Pull Request #45188 · rails/rails

datetime_local_fieldinclude_secondsオプションを追加。

include_seconds: falseを指定することで、入力フィールドの秒の部分を省略できるようになる。

Wojciech Wnętrzak
同CHANGELOGより

参考: Rails 7.1に入る主要な機能まとめ(1): datetime_fieldinclude_secondsオプションが追加された
参考: Rails API datetime_field -- ActionView::Helpers::FormHelper

🔗 Support calls to #field_name with nil object_name by seanpdoyle · Pull Request #45366 · rails/rails

ActionView::Helpers::FormTagHelper#field_name呼び出しでobject_name引数がnilの場合でもエラーにならないようになった。

<%= fields do |f| %>
  <%= f.field_name :body %>
<% end %>

Sean Doyle
同CHANGELOGより

参考: この修正はRails 7.0.4に含まれています

🔗 Strings returned from strip_tags are correctly tagged html_safe? by flavorjones · Pull Request #45218 · rails/rails

strip_tagsで返される文字列が正しくhtml_safe?とタグ付けされるようになった。

これらの文字列にはHTML要素が含まれず、基本的なエンティティもエスケープ済みなので、HTMLコンテンツ内のPCDATAとしてそのまま安全に含められる。レンダリング中にSafeBufferに結合されるときに、エンティティが二重エスケープされるのを防ぐため、html-safeとしてタグ付けされる。

修正: rails/rails-html-sanitizer#124

Mike Dalessio
同CHANGELOGより

参考: この修正はRails 7.0.4に含まれています
参考: 週刊Railsウォッチ20220606: strip_tagsから返される文字列がhtml_safe?で正しくタグ付けされるよう修正

🔗 Move convert_to_model call from form_for into form_with by seanpdoyle · Pull Request #44468 · rails/rails

form_forconvert_to_model呼び出しをform_withに移動。

form_forform_withで実装されるようになったので、convert_to_model呼び出しをform_forから削除した。

Sean Doyle
同CHANGELOGより

参考: Implement form_for by delegating to form_with by seanpdoyle · Pull Request #43421 · rails/rails
参考: 週刊Railsウォッチ20220531: convert_to_model呼び出しをform_forからform_withに移動

🔗 Fix and add protections for XSS in names. · rails/rails@649516c

ActionView::HelpersERB::UtilのXSS保護を修正および追加。

タグヘルパーのタグ名や属性名に含まれる危険な文字をXML仕様に従ってエスケープする。従来の:escape_attributesオプションを:escapeにリネームし、オプションをタグ全体に適用することでシンプルにした。

Álvaro Martín Fraguas
同CHANGELOGより

参考: このセキュリティ修正は7.0.2.4でリリース済みです
参考: 週刊Railsウォッチ20220510: ActionView::HelpersERB::UtilのXSS修正と保護の追加

🔗 Extend audio_tag and video_tag to accept Active Storage attachments by MatheusRich · Pull Request #44085 · rails/rails

Active Storageの添付ファイルにaudio_tagvideo_tagを渡せるようになった。

これにより、以下のように書ける。

audio_tag(user.audio_file)
video_tag(user.video_file)

従来は以下のように書かなければならなかった。

audio_tag(polymorphic_path(user.audio_file))
video_tag(polymorphic_path(user.video_file))

既にサポートされているimage_tagと同じパターン。

Matheus Richard
同CHANGELOGより

参考: 週刊Railsウォッチ20220328: audio_tagvideo_tagActiveStorage::Attachmentオブジェクトを渡せるようにした

🔗 form_for: Attempt to call to_model on first argument by seanpdoyle · Pull Request #44328 · rails/rails

form_forに渡したモデルに対してto_model呼び出しを試行するようになった。

Sean Doyle
同CHANGELOGより


以前の変更については7-0-stableのCHANGELOGを参照。

関連記事

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

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

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


CONTACT

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