2012-11-05 24 views
9

Tôi có một mô hình tương tự như sau,Rails có mặt xác nhận thất bại trên giá trị 0

class Activity < ActiveRecord::Base 
    attr_accessible :name, :admin 

    validates :name, :presence => true 
    validates :admin, :presence => true 
end 

Thuộc tính tên là một chuỗi và tài sản quản trị được định nghĩa là một boolean trong di chuyển.

Nếu tôi cố gắng tạo ra một thể hiện của mô hình trong giao diện điều khiển sử dụng,

a = Activity.create(:name => 'Test', :admin => 0) 

Sau đó, xác nhận không nói rằng tôi cần phải cung cấp giá trị cho quản trị. Tại sao? Tôi đã cung cấp một giá trị.

Tôi có thể hiểu nếu tôi không cung cấp giá trị nào cả hoặc nếu tôi đã cung cấp nil. Nhưng tại sao một giá trị như 0 (hoặc thậm chí sai cho vấn đề đó) gây ra xác nhận để thất bại?

Trả lời

17

validates :presence sử dụng blank? để xác định xem có giá trị hay không. Nhưng false.blank? => true. Do đó xác thực không thành công, vì blank? đang thông báo cho ActiveRecord rằng không có giá trị nào.

Bạn có thể viết lại này như:

validates :field_name, :inclusion => { :in => [true, false] }

theo khuyến cáo trong Rails Guides: ActiveRecord Validations

cũng thấy A concise explanation of nil v. empty v. blank in Ruby on Rails

+0

Làm cho ý nghĩa với tôi Tôi đoán . Nhưng tôi đoán tôi vẫn không đồng ý rằng false.blank? hoặc 0.blank? nên trả lại đúng – richard

+0

Đủ công bằng, nhưng bạn sẽ phải thực hiện điều đó với những người đã viết Rails :) – zetetic

+0

+1. Các giải pháp hoạt động. Nhưng tôi cũng muốn Rails xử lý tốt hơn. Thông báo lỗi khi sử dụng giải pháp ở đây là ': upgraded_kitchen_bathrooms => [" không được bao gồm trong danh sách "]', điều này thật kinh khủng khi xem xét sự đơn giản của những gì chúng ta đang theo sau. –

0

Rails 4/5

validates :name, absence: true 
Các vấn đề liên quan