次の構造を持つ 2 つのモデルがあります。
class Wallet < ActiveRecord::Base
include ActiveModel::Validations
has_one :credit_card
accepts_nested_attributes_for :credit_card
validates :credit_card, :presence => true
validates_associated :credit_card
...
end
class CreditCard < ActiveRecord::Base
include ActiveModel::Validations
belongs_to :wallet
validates :card_number, :presence => true
validates :expiration_date, :presence => true
...
end
RSpec を使用してアプリケーションの機能をテストしていて、奇妙なことに気付きました。ネストされたモデル (nil card_number を持つなど) の検証基準を満たさない属性でハッシュを作成し、update_attributes
呼び出しを実行しようとすると、無効な CreditCard がネストされた Wallet オブジェクトで返されるものモデル、および適切なエラー。これは正しい、予想される動作です。
同じ Hash を取得して run を実行するassign_attributes
とsave
( update_attributes が実行する必要があるのはこれだけですが、完全に nil のネストされたオブジェクトを持つ無効な Wallet オブジェクトが返されます。なぜですか?そして、ネストされたすべてのオブジェクトを更新するにはどうすればよいですか?保存せずに属性値とエラーをチェックしますか?