1

Rails 3.2.11、Mac OS X Mountain Lion、Ruby 1.9.3 を使用しています。

だから私はこのコードを持っています:

class Points < ActiveRecord::Base
validates :id, :presence => true

before_create :validate_points

def validate_points
  if self.amount < 0
    Rails.logger.error "Invalid amount of points"
  else
    save!
  end
end

終わり

ユーザーが負の値を挿入できないように制限したい。しかし、何らかの理由で validate_points メソッドが機能しません。私が間違っていることはありますか?ありがとう。

4

2 に答える 2

3

validates_numericality_ofRailsが提供するメソッドを使用する必要があります

validates :amount, numericality: { greater_than_or_equal_to: 0 }

更新: コードの問題

コードにはいくつかの問題があります。

  1. before_createレコードがデータベースに保存される直前に呼び出されるものを使用しています。この方法でデータベースのコミットを防ぐ唯一の方法は、コールバックで false を返すことですが、これは良い方法ではありません。
  2. validate_points呼び出しますsave!が、コールバックで呼び出されるbefore_createため、レコードを2回保存しています更新:rxingで指摘されているように、これにより、データベースへの2回の保存ではなく、無限ループが発生します

組み込みの検証を使用したくない場合は、次のことを試してください。

validate :validates_amount_points

def validates_amount_points
  errors.add_to :amount, 'must be greater than or equal to 0' if amount < 0
end
于 2013-03-07T06:41:24.830 に答える
1

before_create フックの代わりに「検証」を使用する必要があります。ところで、あなたの before_create も正しくありません。SystemStackError: stack level too deep since "save!" が発生します。before_create を再帰的にトリガーします。

于 2013-03-07T07:17:13.940 に答える