2011-11-02 25 views
55

Tôi đang cố gắng lưu một bản ghi không có một bộ trường - trong đó có một số xác thực trong các mô hình. Mặc dù sự hiện diện không được yêu cầu trong quá trình xác nhận, nhưng nó vẫn ném một lỗi mà trường đó không phải là một số. mô hìnhXác nhận Rails yêu cầu số lượng mặc dù hiện diện không được đặt thành đúng

validates :network_id, :numericality => true 

Mã để được tiết kiệm::

Validation

networks.each do |network| 
    network.url = network.raw_data.link 
    network.save! 
end 

Lỗi:

Validation failed: Network is not a number 

Trả lời

108
validates :network_id, :numericality => true, :allow_nil => true 
+1

cùng một câu trả lời, cùng một lúc => +1 – apneadiving

+0

@Unixmonkey này sẽ là cần thiết cho mọi lĩnh vực trong db cho phép giá trị null? hoặc là có một cách để cho đường ray xử lý điều này tự động (có vẻ như một nỗi đau ass hoặc thiết lập sự hiện diện hoặc allow_nil) – Hopstream

+0

@Hopstream Nếu bạn đang xác nhận tính số, thì nil không phải là một giá trị số. Bạn phải cho phép nó một cách rõ ràng. Bạn không cần phải làm điều này cho tất cả các lĩnh vực. – Unixmonkey

14

Bạn nên sử dụng allow_blank

validates :network_id, :numericality => true, :allow_blank => true 
+0

oh người đàn ông - tôi nghĩ rằng cho phép nil là mặc định. Tôi có nên thêm điều đó vào tất cả các trường được phép là không? loại dường như dư thừa trên một phần ray. – Hopstream

+1

@apneadiving Tôi có thể sai ... nó phải là 'validates: network_id,: numericality => {: allow_blank => true}', phải không? –

+0

@Hopstream: xem liên kết của tôi: Tùy chọn: allow_blank tương tự như tùy chọn allow_nil – apneadiving

38
validates :network_id, :numericality => {:allow_blank => true} 
+3

Tôi nghĩ đó là cách thích hợp để viết, +1 rồi – apneadiving

+0

Câu trả lời hữu ích hơn –

+0

Điều này thực sự tốt hơn nó cho phép các chuỗi rỗng: http://edgeguides.rubyonrails.org/active_record_validations.html#allow-blank – Hopstream

9

Trong Rails 4 (Ruby 2), bạn có thể viết:

validates :network_id, numericality: { greater_than_or_equal_to: 0, allow_nil: true } 
+2

Tôi không biết tại sao điều này không hiệu quả với tôi. Tôi đang sử dụng Rails 4.2. Với việc xác thực đó, tôi có thể lưu với giá trị nil, nhưng nó cũng cho phép lưu chuỗi. – leandrotk

0

Bạn cũng có thể viết như thế này ...

validates_numericality_of :network_id, allow_nil: true 
Các vấn đề liên quan