2009-08-26 20 views
14

Tôi có một Danh mục và Mô hình bài đăng, với mỗi Bài đăng thuộc Danh mục. Trước khi tạo hoặc cập nhật bài đăng, tôi cần kiểm tra xem danh mục đã chọn có tồn tại không. Cách tốt nhất để xác thực thông tin này là gì?Đường ray: Xác thực sự tồn tại của một liên kết

Hiện tại, tôi đang tìm kiếm trong bộ điều khiển để đảm bảo rằng danh mục tồn tại. Có thể đặt các loại xác thực này trong mô hình không?

Trả lời

14

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_presence_of :category 
end 

-HOẶC-

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates :category, presence: => true 
end 

Rails các phiên bản trước 3.2:

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_existence_of :category 
end 
+0

Điều này có hiệu quả nếu danh mục bị nhiễu? Nói rằng danh mục thuộc về Blog. Người dùng chỉ được phép chọn danh mục thuộc về blog. – Homar

+0

@Homar Không chắc chắn về phạm vi, nếu liên kết thuộc tính bao gồm hạn chế này, tôi cho rằng nó sẽ hoạt động. –

+0

này đã được đổi tên thành validates_presence_of trong các phiên bản đường ray mới hơn – Fa11enAngel

5

Tôi đã đặt điều này trong mô hình của tôi:

validate :ensure_category_exists 

    def ensure_category_exists 
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id) 
    end 

Bản in nào "Danh mục không hợp lệ" nếu danh mục không tồn tại cho blog mẹ.

-1

Trong Rails 3, validates_associated có lẽ là những gì bạn đang tìm kiếm? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

+2

'validates_associated' sẽ chạy các xác nhận hợp lệ trên mô hình liên kết và không mô hình chính nếu liên kết không hợp lệ. Vì vậy, nó sẽ xác nhận sự tồn tại, nhưng có hành vi bổ sung OP có thể hoặc có thể không muốn. – Woahdae

+3

Tôi đã thử nghiệm điều này và 'validates_associated' không phá vỡ nếu mô hình liên quan không tồn tại (như bạn mong đợi). Tôi đoán nếu chỉ thất bại nếu mô hình liên quan không tồn tại, có xác nhận, và ít nhất một trong số họ không thành công. – hsribei

+0

Như obvio171 đã nói, validates_associated KHÔNG xác thực sự tồn tại của liên kết. – hrdwdmrbl

20

Trong Rails 3.2, validates_existence_of được thay thế bằng validates_presence_of.

+4

cũng có thể là 'validates: category,: presence => true' –

1

Bằng cách tôi suy nghĩ một lựa chọn tốt hơn là đá quý này: https://github.com/perfectline/validates_existence

Nó xác nhận sự tồn tại của mô hình có liên quan trong cơ sở dữ liệu. Hãy tưởng tượng bạn có một trường thả xuống cung cấp một số dữ liệu rác ngay cả khi bạn không chọn bất kỳ thứ gì (nhãn mặc định không được chọn đầu tiên là giá trị). Xác nhận hiện diện sẽ không hoạt động, vì nó sẽ chuyển cho dữ liệu hiện có. Nhưng chúng tôi muốn một số ràng buộc và kiểm tra bên DB này là những gì giải quyết vấn đề.

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