40

Trong Rails 2.x bạn có thể sử dụng kiểm chứng thực để đảm bảo bạn có một giá trị duy nhất kết hợp như thế này:Rails 3: Xác nhận kết hợp các giá trị

validates_uniqueness_of :husband, :scope => :wife 

Trong cuộc di cư tương ứng nó có thể trông như thế này:

add_index :family, [:husband, :wife], :unique => true 

Điều này sẽ đảm bảo kết hợp vợ/chồng là duy nhất trong cơ sở dữ liệu. Bây giờ, trong Rails 3 cú pháp xác nhận đã thay đổi và thuộc tính scope dường như đã biến mất. Nó bây giờ trông giống như:

validates :husband, :presence => true 

Bất kỳ ý tưởng nào tôi có thể đạt được xác thực kết hợp trong Rails 3? Xác nhận Rx 2.x vẫn hoạt động trong Rails 3 vì vậy tôi vẫn có thể sử dụng ví dụ đầu tiên nhưng có vẻ "cũ", có cách nào tốt hơn không?

Trả lời

57

Hãy theo tôi. Cách thức phương thức validates trong ActiveModel hoạt động là tìm một Validator.

:presence => true tìm kiếm PresenceValidator và chuyển các tùy chọn: true vào trình khởi tạo của trình xác thực.

Tôi nghĩ rằng bạn muốn

validates :husband, :presence => true, :uniqueness => {:scope => :wife} 

(Các validator độc đáo thực sự là một phần của ActiveRecord, không ActiveModel. Nó thực sự thú vị như thế nào các nhà phát triển thiết lập này. Nó khá thanh lịch.)

+1

Tôi chỉ xác nhận điều này hoạt động trong ứng dụng của riêng tôi. – epochwolf

+0

Điều này nghe có vẻ tuyệt vời và sạch sẽ và tất cả nhưng ... nó không hoạt động trong dự án mẫu của tôi 'một mô hình' tôi đã thử. Các bạn có làm gì đặc biệt không? Tôi đã sử dụng 2 chuỗi và cũng đã thử với 2 số nguyên nhưng xác thực vừa qua. – Cimm

+0

Tôi đang sử dụng 'validates: contents,: presence => true,: uniqueness => {: scope =>: comment_thread_id,: message =>" đã được nói rồi, hãy thêm một cái gì đó có ý nghĩa "}' – epochwolf

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