2012-03-20 26 views
14

Tôi đã tạo mô hình với một số trường phải chấp nhận cùng một định dạng dữ liệu (chuỗi, nhưng có thể là bất kỳ thứ gì, FWIW). Tôi muốn áp dụng cùng một quy tắc xác nhận cho tất cả các trường đó. Tất nhiên, tôi chỉ có thể tiếp tục và sao chép/dán nội dung, nhưng điều đó sẽ chống lại nguyên tắc DRY, và thông thường quá ...Rails 3: Áp dụng cùng một quy tắc xác nhận cho nhiều trường bảng

Tôi đoán điều này là khá dễ dàng, nhưng tôi là một người mới đến/hipster Rails , do đó, lý do-moi cho một câu hỏi nhỏ. =)

Trả lời

21

Vì vậy, nếu bạn có nói ba lĩnh vực để xác nhận:

:first_name 
:last_name 
:age 

Và bạn muốn họ tất cả để được xác nhận? Vì vậy, một cái gì đó như thế này:

validates_presence_of :first_name, :last_name, :age 

Edit: Có rất nhiều phương pháp xác nhận khác nhau trong Rails) và họ đang tuyệt vời linh hoạt). Đối với định dạng của trường, bạn có thể sử dụng validates_format_of và sau đó sử dụng Cụm từ thông dụng để khớp với nó. Dưới đây là ví dụ về cách đối sánh email:

validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 

Tôi muốn xem hướng dẫn Active Record Validations and Callbacks; nó cung cấp thông tin chi tiết toàn diện về rất nhiều tính năng mà Active Record cung cấp dưới dạng xác nhận. Bạn cũng có thể xem tài liệu here.

+0

Vâng, nhưng điều gì kỳ lạ hơn, như kết hợp regex? – aL3xa

+0

Tôi nhận ra cách ngu ngốc/đơn giản như thế nào. Xin lỗi, và cảm ơn! =) – aL3xa

+0

Không sao cả! Tôi cũng đã đi trước và đính kèm một số chi tiết/tài nguyên. Nếu bạn đã tìm thấy câu trả lời này làm giải pháp, vui lòng "chấp nhận" câu trả lời bằng cách nhấp vào biểu tượng bên cạnh bài đăng của tôi. Điều đó sẽ cho biết câu hỏi đã đóng và bạn hài lòng với sự giúp đỡ của tôi. Chúc bạn may mắn với đường ray học tập! –

5

Nếu bạn đang sử dụng bất kỳ kiểm chứng thực built-in (hiện diện, length_of), bạn có thể áp dụng một xác nhận duy nhất để nhiều thuộc tính như thế này:

validates_presence_of :name, :email 

Nếu bạn có logic tùy chỉnh bạn có thể tạo một đối tượng validator đến nhà mã và áp dụng nó riêng

class EmailValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    record.errors[attribute] << (options[:message] || "is not an email") unless 
     value =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i 
    end 
end 

def Person 
    validates :home_email, :email => true 
    validates :work_email, :email => true 
end 

see: http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3/

1

Sử dụng Themis cho việc này:

# Describe common validation in module 
module CommonValidation 
    extend Themis::Validation 

    validates_presence_of :foo 
    validates_length_of :bar, :maximum => 255 
end 

class ModelA < ActiveRecord::Base 
    # import validations 
    include CommonValidation 
end 

class ModelB < ActiveRecord::Base 
    # import validations 
    include CommonValidation 
end 
3

Trong Rails 4 bạn có thể áp dụng các xác nhận cùng với nhiều cột bằng cách sử dụng một vòng lặp:

[:beds, :baths].each do |column| 
    validates column, allow_blank: true, length: { maximum: 25 } 
end 

Cả hai giường và phòng tắm được xác nhận bằng cách sử dụng kiểm chứng thực tương tự.

Chỉnh sửa:

Trong Rails 4.2, bạn có thể làm điều tương tự bằng cách đặt nhiều biểu tượng sau khi cuộc gọi chức năng xác thực. Ví dụ:

validates :beds, :baths, allow_blank: true 
Các vấn đề liên quan