2010-09-22 20 views
8

Tôi có một đối tượng có thuộc tính được gọi là giá trị có loại thập phân lớn. Trong định nghĩa lớp tôi có validates_numericality_of.xác thực trước khi người định cư thuộc tính có thể nhập số

Tuy nhiên nếu tôi:

a.value = 'fire' 

'lửa' kết thúc lên nhận định kiểu để loại chính xác trước khi cháy xác nhận như vậy:

a.valid? => true 

Làm thế nào để có được xác nhận để kích hoạt trước khi thợ đúc chư?

Cảm ơn

Dan

Trả lời

14

Từ ActiveRecord::Base docs:

Đôi khi bạn muốn để có thể đọc các dữ liệu thuộc tính nguyên mà không cần phải cột được xác định để định kiểu chạy nhiên của nó đầu tiên. Điều đó có thể được thực hiện bằng cách bằng cách sử dụng các đối tượng truy cập <attribute>_before_type_cast mà tất cả các thuộc tính đều có. Ví dụ: Ví dụ: nếu mô hình Account của bạn có thuộc tính số dư, bạn có thể gọi account.balance_before_type_cast hoặc account.id_before_type_cast.

Điều này đặc biệt hữu ích trong những tình huống xác nhận nơi người dùng có thể cung cấp một chuỗi cho một trường số nguyên và bạn muốn hiển thị chuỗi gốc trở lại trong một lỗi nhắn. Truy cập thuộc tính thường sẽ định kiểu chuỗi thành 0, không phải là thứ bạn muốn.

+0

Fyi, nếu bạn muốn thực hiện việc này mà không nhận được thông báo xác thực lạ trong chế độ xem của mình. Ví dụ. " trước khi nhập loại phải là số" bạn có thể tạo [trình xác thực tùy chỉnh] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#custom-validators) để kiểm tra '" # {attribute} _before_type_cast "' thay vì chỉ cần kiểm tra thuộc tính. – Ajedi32

+0

@ Ajedi32 Hoặc vượt qua: tùy chọn tin nhắn để xác nhận? – sheerun

+2

@sheerun Không, điều đó sẽ không hoạt động vì tùy chọn tin nhắn không thay đổi thuộc tính mà lỗi xác thực được liên kết với. (Ví dụ: " trước khi loại diễn viên phải là một số", bạn chỉ có thể sử dụng tùy chọn đó để thay đổi phần "phải là số" của thư.) – Ajedi32

1

Một viên ngọc mới đã được tạo để trợ giúp validate types in rails.

An explanatory blog post tồn tại để trả lời thêm về "tại sao" nó được tạo ở nơi đầu tiên.

Với thư viện này mã của bạn có thể là:

class SomeObject < ActiveRecord::Base 
    validates_type :value, :big_decimal 
end 

này sẽ ném một ngoại lệ khi bất cứ điều gì ngoại trừ một phao được gán cho value thay vì âm thầm đúc các value đến một BigDecimal và lưu nó.

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