rails:1528
From: Nobuhiro IMAI <nov@y...>
Date: Wed, 16 Aug 2006 15:04:06 +0900 (JST)
Subject: [rails:1528] Re: 検証ヘルパーは save メソッドの際のみ有効?
いまいです。 From: Keiji Yoshimi <walf443_at_gmail.com> Date: Wed, 16 Aug 2006 14:16:35 +0900 > よしみです。 > > > license2.key_number = 1 > > license2.save > > > > はエラーになるものの、 > > > > license2.update_attribute(:key_number, 1) > > > > はエラーにならず、重複データが登録できてしまいました。 > > > > どうも検証ヘルパーが save メソッドの際にしか効いていない > > ような気がするのですが、何がおかしいのか良く分かりません。 > うーん。ActiveRecord::Baseのupdate_attributeメソッドの定義を見た感じでは、 > 内部的にsaveを呼び出してるので、前者も後者も同じコードのはずなんですが…。 > > 1430 def update_attribute(name, value) > 1431 send(name.to_s + '=', value) > 1432 save > 1433 end validations.rb では alias_method :save_without_validation, :save alias_method :save, :save_with_validation alias_method :save_without_validation!, :save! alias_method :save!, :save_with_validation! alias_method :update_attribute_without_validation_skipping, :update_attribute alias_method :update_attribute, :update_attribute_with_validation_skipping こんなことになってて、 def update_attribute_with_validation_skipping(name, value) send(name.to_s + '=', value) save(false) end とされています。ここの save はもちろん save_with_validation で、 def save_with_validation(perform_validation = true) if perform_validation && valid? || !perform_validation save_without_validation else false end end となり、結局 save_without_validation が呼ばれちゃいます。なので、 license2.update_attribute_without_validation_skipping(:key_number, 1) #=> false とするか(しないですね :)、update_attribute じゃなく update_attributes の方を使って license2.update_attributes(:key_number => 1) #=> false とするのがいいと思います。 -- Nobuhiro IMAI <nov@y...> Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106 -- ML: rails@r... 使い方: http://QuickML.com/
1522 2006-08-15 12:57 [bsdmad@g... ] 検証ヘルパーは save メソッドの際のみ有効? 1523 2006-08-15 14:27 ┣[sakuro@e... ] 1526 2006-08-16 06:08 ┃┗[bsdmad@g... ] 1527 2006-08-16 07:16 ┗[walf443@g... ] -> 1528 2006-08-16 08:04 ┗[nov@y... ] 1529 2006-08-16 09:14 ┣[walf443@g... ] 1533 2006-08-17 10:59 ┗[bsdmad@g... ]