2009-12-31 31 views
18

Tôi có mô hình Chuyến đi, trong đó các thuộc tính khác có giá trị start_odometer và end_odometer. Trong mô hình của tôi, tôi muốn xác nhận rằng đồng hồ đo cuối cùng lớn hơn đồng hồ đo bắt đầu. Đồng hồ đo cuối cũng có thể để trống vì chuyến đi có thể chưa kết thúc.Rails more_than xác thực mô hình đối với thuộc tính mô hình

Tuy nhiên, tôi không thể tìm ra cách so sánh một thuộc tính với thuộc tính khác.

Trong trip.rb:

so sánh với biểu tượng:

validates_numericality_of :end_odometer, :greater_than => :start_odometer, :allow_blank => true 

mang lại cho tôi những lỗi:

ArgumentError in TripsController#index

:greater_than must be a number

so sánh với các biến:

validates_numericality_of :end_odometer, :greater_than => start_odometer, :allow_blank => true 

NameError in TripsController#index

undefined local variable or method `start_odometer' for #

+1

tôi cảm thấy đây sẽ là một cái gì đó hữu ích trong Rails. Có lẽ gửi một vé đến Lighthouse: http://rails.lighthouseapp.com cho nó? –

Trả lời

18

Bạn có lẽ sẽ cần phải viết một phương thức xác nhận tùy chỉnh trong mô hình của bạn cho việc này ...

validate :odometer_value_order 

def odometer_value_order 
    if self.end_odometer && (self.start_odometer > self.end_odometer) 
    self.errors.add_to_base("End odometer value must be greater than start odometer value.") 
    end 
end 
+0

Cảm ơn bạn, hoạt động tuyệt vời! – Ryan

-4

Đó là một chút kludgy, nhưng điều này dường như làm việc:

validates_numericality_of :end_odometer, :greater_than => :start_odometer.to_i, :allow_blank => true 
+0

Bạn sẽ cần một proc hoặc lambda để ví dụ này hoạt động. – holden

+3

Hầu hết chắc chắn không hoạt động, điều này chuyển đổi ký hiệu ': start_odometer' thành một số nguyên và chuyển nó thành': greater_than'. ** Không sử dụng mã này, nó hoàn toàn sai **. – meagar

32

Bạn don' t nhất thiết cần một phương pháp xác nhận tùy chỉnh cho trường hợp này. Trong thực tế, đó là một chút overkill khi bạn có thể làm điều đó với một dòng. Đề xuất của jn80842 là gần, nhưng bạn phải bọc nó trong một Proc hoặc Lambda để nó hoạt động.

validates_numericality_of :end_odometer, :greater_than => Proc.new { |r| r.start_odometer }, :allow_blank => true 
+0

Đã tìm kiếm cùng một điều và cách tiếp cận này hoạt động tuyệt vời cho tôi. – Sg1team

+4

Không cần '' '', chỉ cần ': start_odometer' sẽ hoạt động. –

6

Bạn có thể xác thực thuộc tính mô hình nếu bạn sử dụng Proc.

Trong rails4 bạn sẽ làm một cái gì đó như thế này:

class Trip < ActiveRecord::Base 
    validates_numericality_of :start_odometer, less_than: ->(trip) { trip.end_odometer } 
    validates_numericality_of :end_odometer, greater_than: ->(trip) { trip.start_odometer } 
end 
Các vấn đề liên quan