5

を割り当てていない:私はRSpecのと私のアプリケーションの機能をテストしていRailsの「assign_attributesは、」私は、次の構造を持つ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 

を、私は奇妙な何かに気づきました。入れ子になったモデル(nil card_numberなど)の検証基準を満たさない属性を持つハッシュを作成してupdate_attributes呼び出しを実行しようとすると、無効なクレジットカードでウォレットオブジェクトに返されるものネストされたモデル、および適切なエラーが含まれます。それが正しい、期待される行動です。

私は、なぜそれがあるか、そしてどのようにすることができます。そして、私は完全にゼロネストされたオブジェクトに無効なウォレットオブジェクトを返します、update_attributesがやるべきことすべてである(ただし、同じハッシュを取り、assign_attributesを実行し、save場合私は、ネストされた属性値のすべてを更新し、保存せずにエラーをチェック

答えて

4

まず - ?。あなたはinclude ActiveModel::Validations Bには必要ありません。彼らはActiveRecord::Baseと来る。

update_attributesは内部でassign_attributesを使用しているため、基本的には期待通りに動作するはずです。

attr_accessibleattr_protectedwith/without_protectionオプションを持っていないと私はあなたが

{'credit_card_attributes' => {'card_number' => ''}} 

との適切なハッシュを作成していると仮定した場合、それは、レール内のバグのいくつかの種類のように見えます。しかし同時に、私はそれをチェックしたところ、うまく動作しているようです。その上

あなただけのテストでオブジェクトを保存せずに検証を確認したい場合は、ちょうどそれは、ネストされたCREDIT_CARD、その上にエラーが発生して、適切なウォレットオブジェクトを返す必要があります

Wallet.new(hash_with_attributes).valid? 

を実行します。

0

私はそれを理解し、assign_attributesはセキュリティチェックをスキップし、すべての

In Rails 3, is there a difference between = and assign_attributes?

+0

そのリンクは反対であると思われます(等号はセキュリティチェックをスキップする機能です)。そして、なぜそれが私が見ている行動につながるのか分からない。 – Bryce

1

Strong Params(Rails 4の機能)がネストされた属性を取り除く可能性があり、エラーが発生して編集が失敗し、エラーのある編集ページにリダイレクトされ、クレジットカードのnested_attributesがnilになりました。

これはおそらく役立ちます。 https://stackoverflow.com/a/17532811/793330

saveとupdate_attributesも同じではありません。 Saveはオブジェクト全体を保存しますが、updateは変更されたアイテムだけを変更します。若干違いはありますが違いはありません。

関連する問題