[前][次][番号順一覧][スレッド一覧]

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...         ]