1

作成時に提供されるいくつかの属性を持つモデルがあります。モデルには、提供された属性から派生した追加の属性もいくつかありますが、これも作成時に計算したいと考えています。さらに問題なのは、これらの派生値に対して検証を実行できるようにすることです (無効な派生値につながる、それ自体で有効な入力があるため)。

問題は、私がこれを行うときです:

class MyClass < ActiveRecord::Base
  attr_accessible :given1, :given2, :derived

  before_validation :derivation
  validates_uniqueness_of :derived

  def derivation
    self.derived = self.given1 + self.given2
  end
end

MyClass.new(:given1 => aNumber, :given2 => otherNumber)

に追加できないというエラーが常に表示nilされnilます。self.attribute検証と作成プロセスがさらに進むまで、明らかにゼロです。

明らかに、派生した値を後の段階で設定し、特定の属性で機能するカスタム検証を追加できますが、それには派生を 2 回行う必要があり、あまり DRY ではありません。

before_validatesステージで割り当てられているがまだ検証されていない属性を取得する他の方法はありますか?

編集:明確にするために、検証チェックのMyClass.new(:given1 => aNumber, :given2 => otherNumber)に呼び出して派生値を計算し、検証が呼び出したかのようにチェックするようにします。問題は、渡されたおよびメソッドの値にアクセスできないように見えることです。MyClass.new(:given1 => aNumber, :given2 => otherNumber, :derived => aNumber + otherNumber):given1:given2before_validations

4

1 に答える 1

1

次のような独自のコード スニペットを作成しました。

class User < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name

  validates :email, uniqueness: true

  before_validation :derivation

  def derivation
    self.email = self.first_name + self.last_name
  end
end

以下を実行してもエラーは発生しませんでした。

»  u = User.new first_name: "leo", last_name: "correa"
=> #<User:0x007ff62dd8ace0> {
                      :id => nil,
              :first_name => "leo",
               :last_name => "correa",
                   :email => nil,
              :created_at => nil,
              :updated_at => nil,
}
»  u.valid?
  User Exists (0.9ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'leocorrea' LIMIT 1
=> true

実行するとレコードが正常に保存され、電子メールが既に使用されていたため、返された新しいレコードをu.save繰り返して保存すると、レコードが保存されました。User.newROLLBACK

いずれにせよ、使用している変数を given1、given2 に割り当てていることを確認し、結果が何であれ、false を与えていないことを確認してください。なぜなら、before_validate コールバックがキャンセルされ、レコードが保存されないためです。

于 2013-01-09T22:00:02.757 に答える