2010-12-11 41 views
52

Cách đường ray để triển khai trình xác thực tối đa tối thiểu trong Rails 3 là gì?Làm cách nào để triển khai trình xác thực tối thiểu/tối đa trong Rails 3?

Tôi có một mô hình, với các thuộc tính min_age và max_age.

Tuổi có thể trong khoảng 0..100, nhưng tôi cũng muốn để xác nhận giá trị qua, tôi có nghĩa là tối đa là greather hơn hoặc bằng MIN

{:min_age => 0, :max_age => 0} => true 
{:min_age => 0, :max_age => 1} => true 
{:min_age => 1, :max_age => 0} => false # max < min 
{:min_age => 1, :max_age => 101} => false # out of 0..100 range 

Trả lời

97

Kiểm tra các ActiveModel :: validations :: NumericalityValidator: RailsAPI NumericalityValidator

spec:

it { 
    subject.max_age = 10 
    subject.min_age = 20 
    subject.should be_invalid 
    subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}") 
} 

mã:

validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age } 

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

Tôi không biết bạn có muốn xác thực sự hiện diện hay không, nhưng bạn chỉ cần thêm điều đó làm khóa khác để xác thực, ví dụ:

validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true 
+0

ok, nhờ ví dụ này !! – Robert

+0

Lưu ý - điều này làm việc tốt trên "tạo" nhưng trên "cập nhật" tôi đã nhận được lỗi "cấp độ xếp chồng quá sâu" - sử dụng các đầu vào hợp lệ - đó là một con thú để tìm. Không có đầu mối xác nhận này là nguyên nhân kể từ khi lỗi làm cho không có ref cho dòng mã trước vòng lặp. – JosephK

27

Bạn cũng có thể sử dụng inclusion...in, như trong:

validates :height, :inclusion => { :in => 1..3000, :message => "The height must be between 1 and 3000" } 
9
validates_numericality_of :min_age, greater_than: 0 
validates_numericality_of :max_age, less_than_or_equal_to: 100 
validates_numericality_of :max_age, greater_than: :min_age 

Bạn cũng có thể sử dụng tuổi, như thế này:

validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0 
+0

min_age 30, max_age 10, vẫn sẽ nhận được máng, nhưng không nên - dòng thứ ba của tôi trong câu hỏi. – astropanic

+0

Tôi đề nghị bạn sử dụng một đầu vào độ tuổi duy nhất, chứ không phải là min và max. Một cách để giải quyết là thực thi có max_age lớn hơn min_age. Xem chỉnh sửa của tôi. Tôi đã không kiểm tra mã. Trong mọi trường hợp, bạn cần phải có một số mã để đảm bảo rằng độ tuổi tối thiểu không lớn hơn độ tuổi tối đa. – EastsideDeveloper

+0

Tôi không thể sử dụng một thuộc tính duy nhất vì nó không phải là độ tuổi mà là độ tuổi. Tôi biết tôi cần một số mã để đảm bảo giá trị vượt qua, đó là câu hỏi của tôi. – astropanic

Các vấn đề liên quan