Active Model CHANGELOG(v7.1.0.beta1)
Support composite identifiers in to_key
by nvasilevski · Pull Request #48998 · rails/rails
to_key
で複合idをサポート。
#id
が既に配列になっている場合、to_key
は#id
をArray
にラップしないようになる。Nikita Vasilevsky
同CHANGELOGより
参考: Rails API to_key
-- ActiveModel::Conversion
Allow redefining to_param
delimiter using param_delimiter
by nvasilevski · Pull Request #49020 · rails/rails
to_param
で使われるデリミタを設定できるActiveModel::Conversion.param_delimiter
を追加。Nikita Vasilevsky
同CHANGELOGより
参考: 週刊Railsウォッチ20230906: to_param
のデリミタをparam_delimiter
で変更可能になった
Call proxy methods from alias_attribute
generated methods by nvasilevski · Pull Request #48533 · rails/rails
undefine_attribute_methods
メソッドが、属性メソッドに加えてエイリアス属性メソッドも未定義化するようになった。Nikita Vasilevsky
同CHANGELOGより
参考: Rails API undefine_attribute_methods
-- ActiveModel::AttributeMethods::ClassMethods
Fix AM::Error.full_message to remove ":base" by zzak · Pull Request #48871 · rails/rails
Error.full_message
で出力されるメッセージから":base"を削除。zzak
同CHANGELOGより
参考: これはRails 7.0.7で導入済みです。
Add a load hook for ActiveModel::Model
by lewispb · Pull Request #48698 · rails/rails
ActiveRecord::Base
の読み込みフックと一致する読み込みフック(名前はactive_model
)をActiveModel::Model
に追加し、ActiveModel::Model
クラスの一部を上書き可能にした。Lewis Buckley
同CHANGELOGより
Improve Password Length Validation for BCrypt Compatibility by guilleiguaran · Pull Request #47708 · rails/rails
ActiveModel::SecurePassword
のパスワード長バリデーションで、バイトサイズにおけるBCrypt互換性を考慮するよう改善。従来のパスワード長バリデーションでは文字数カウントだけを考慮していたが、これはBCryptの「72バイト」サイズ制限を正確に反映しない場合がある。この変更では、文字数とバイトサイズの両方を考慮したバリデーションを行うと同時に、文字長のバリデーションが変わらないようにした。
user = User.new(password: "a" * 73) # 73文字 user.valid? # => false user.errors[:password] # => ["is too long"] user = User.new(password: "あ" * 25) # 25文字だが75バイト user.valid? # => false user.errors[:password] # => ["is too long"]
ChatGPT, Guillermo Iguaran
同CHANGELOGより
参考: 週刊Railsウォッチ20230502: ActiveModel::SecurePassword
のサイズバリデーションをBCryp
t仕様の上限に合わせて修正
Enhance has_secure_password to also generate a password_salt method by lazaronixon · Pull Request #47490 · rails/rails
has_secure_password
が、パスワードダイジェストを計算用のsaltを返す#{attribute}_salt
メソッドを生成するようになった。このsaltはパスワードが変更されると必ず変更されるので、
generates_token_for
で一度だけ使えるパスワードリセットトークンを作成するのに利用可能。class User < ActiveRecord::Base has_secure_password generates_token_for :password_reset, expires_in: 15.minutes do password_salt&.last(10) end end
Lázaro Nixon
同CHANGELOGより
参考: 週刊Railsウォッチ20230328: has_secure_password
がsalt生成メソッドを生成するよう修正
Improve typography of user facing validation messages by jdufresne · Pull Request #45463 · rails/rails
ユーザー向けエラーメッセージのタイポグラフィを改善。
英語の短縮形では、UnicodeのAPOSTROPHE(U+0027
)をRIGHT SINGLE QUOTATION MARK(U+2019
)に置き換えた。たとえば、従来の「
can't be blank
」は「can’t be blank
」と表示されるようになる。Jon Dufresne
同CHANGELOGより
参考: Rails v7.1.0 で can't be blank
が can’t be blank
に変わる - アジャイルSEの憂鬱
Add class name to ActiveModel::MissingAttributeError error message by p8 · Pull Request #47569 · rails/rails
ActiveModel::MissingAttributeError
エラーメッセージにクラス名を表示するようになった。属性を持っていないクラス名を以下のようにエラーメッセージで表示する。
user = User.first user.pets.select(:id).first.user_id # => ActiveModel::MissingAttributeError: missing attribute 'user_id' for Pet
Petrik de Heus
同CHANGELOGより
参考: 週刊Railsウォッチ20230328: MissingAttributeError
でクラス名を表示するようになった
Fix as_json
call on ActiveModel::Type's child classes. by nashby · Pull Request #46535 · rails/rails
ActiveModel::Type::Value
が#as_json
で予想外の結果を回避するためNoMethodError
をraiseするようになった。Vasiliy Ermolovich
同CHANGELOGより
Avoid double cast in types that only override cast by jonathanhefner · Pull Request #46219 · rails/rails
Active Modelの組み込み型を継承し、
serialize
メソッドをオーバーライドしないカスタム属性について、データベース向けに属性値をシリアライズするときの最適化が行われるようになった。たとえば、以下のようなカスタム属性があるとする。
class DowncasedString < ActiveModel::Type::String def cast(value) super&.downcase end end ActiveRecord::Type.register(:downcased_string, DowncasedString) class User < ActiveRecord::Base attribute :email, :downcased_string end user = User.new(email: "FooBar@example.com")
データベース向けの
cast
については、さらなる改善が見込まれそう。Jonathan Hefner
同CHANGELOGより
Support password challenge via has_secure_password
by jonathanhefner · Pull Request #43688 · rails/rails
has_secure_password
で、password_challenge
アクセサとバリデーションによるパスワードチャレンジ機能をサポートするようになった。パスワードチャレンジは、現在のユーザーが本物のパスワード所有者であることを確認するための予防策である。パスワードチャレンジは、モデルの機密性の高いフィールド(パスワード自身など)を変更するときに使うものであり、パスワード入力間違いを防ぐためのパスワード確認入力とは異なることに注意。
password_challenge
が設定済みの場合、その値のダイジェストが現在永続化済みのpassword_digest
(すなわちpassword_digest_was
)と一致しているかどうかをバリデーションでチェックするようになる。これにより、パスワードチャレンジを通常の
update
呼び出しの一部として実行可能になり、パスワードチャレンジエラーを他のバリデーションエラーと同じ方法で処理できるようになる。たとえば、コントローラで以下のように書く代わりに、
password_params = params.require(:password).permit( :password_challenge, :password, :password_confirmation, ) password_challenge = password_params.delete(:password_challenge) @password_challenge_failed = !current_user.authenticate(password_challenge) if !@password_challenge_failed && current_user.update(password_params) # ... end
以下のように書ける。
password_params = params.require(:password).permit( :password_challenge, :password, :password_confirmation, ).with_defaults(password_challenge: "") if current_user.update(password_params) # ... end
ビューでは、
@password_challenge_failed
を独自にチェックする必要なしに、password_challenge
フィールドのエラーを他のフォームフィールドと同様にレンダリングすることも、config.action_view.field_error_proc
設定で表示をカスタマイズすることも可能になる。Jonathan Hefner
同CHANGELOGより
参考: 週刊Railsウォッチ20220801: SecurePassword
の改善2つ
Support infinite ranges for LengthValidator
s :in
/:within
options by fatkodima · Pull Request #45138 · rails/rails
LengthValidator
の:in
オプションや:within
でbeginless rangeやendless rangeをサポート。validates_length_of :first_name, in: ..30
fatkodima
同CHANGELOGより
Rails 7.1: Active Modelバリデーションのin・withinオプションでbeginless/endless rangeをサポート(翻訳)
Add beginless range support to clusivity by bjeanes · Pull Request #45123 · rails/rails
validates_inclusion_of
やvalidates_exclusion_of
でbeginless rangeやendless rangeをサポート。validates_inclusion_of :birth_date, in: -> { (..Date.today) }
Bo Jeanes
同CHANGELOGより
Make validators accept lambdas without record argument by fatkodima · Pull Request #45118 · rails/rails
バリデータに
record
引数なしのlambdaを渡せるようになった。# 変更前 validates_comparison_of :birth_date, less_than_or_equal_to: ->(_record) { Date.today } # 変更後 validates_comparison_of :birth_date, less_than_or_equal_to: -> { Date.today }
fatkodima
同CHANGELOGより
参考: 週刊Railsウォッチ20220523: バリデーションでlambdaをrecord引数なしで渡せるように修正
Fix casting long strings to Date, Time or DateTime by fatkodima · Pull Request #45005 · rails/rails
長い文字列を
Date
、Time
、DateTime
に変換するとエラーになる問題を修正。fatkodima
同CHANGELOGより
参考: 週刊Railsウォッチ20220516: 長い文字列をDate・Time・DateTimeにキャストしたときにエラーにならないよう修正
Use different namespace for proxy calls · rails/rails@81519de
プロキシ呼び出し用のキャッシュ名前空間を変更。
現在のモデルは、同じメソッド名に対して異なる属性本体を持つことが可能であるため、競合が発生する可能性がある。新しい名前空間
:active_model_proxy
を追加することで、この問題を修正する。Chris Salzberg
同CHANGELOGより
以前の変更については7-0-stableのCHANGELOGを参照。
関連記事
Rails 7.1に入る主要な機能まとめ(2)error_highlight対応、routes --grepほか(翻訳)
The post Rails 7.1.0 Active Model CHANGELOG(翻訳) first appeared on TechRacho.
概要
MITライセンスに基づいて翻訳・公開いたします。
7.1.0リリーズ後に更新があれば反映します。
参考: Active Model の基礎 - Railsガイド