Rails: Xác thực độ dài tối thiểu và tối đa của một chuỗi nhưng cho phép nó để trống


87

Tôi có một trường mà tôi muốn xác thực. Tôi muốn trường có thể được để trống, nhưng nếu người dùng đang nhập dữ liệu, tôi muốn trường ở định dạng nhất định. Hiện tại tôi đang sử dụng các xác thực dưới đây trong mô hình, nhưng điều này không cho phép người dùng để trống:

validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5

Làm thế nào để tôi viết điều này để hoàn thành mục tiêu của tôi?

Câu trả lời:



130

Bạn cũng có thể sử dụng định dạng này:

validates :foo, length: {minimum: 5, maximum: 5}, allow_blank: true

Hoặc vì tối thiểu và tối đa của bạn giống nhau, những điều sau đây cũng sẽ hoạt động:

validates :foo, length: {is: 5}, allow_blank: true


11

Hoặc ngắn gọn hơn nữa (với cú pháp băm mới), từ tài liệu xác thực :

validates :foo, length: 5..5, allow_blank: true

Giới hạn trên có lẽ nên thể hiện một số ý nghĩa hơn như "in: 5..20", nhưng chỉ trả lời câu hỏi cho bức thư.


Không nghĩ rằng insẽ hoạt động với các chuỗi, dường như chỉ là những con số
ecoologic

1
Điều này sẽ làm việc thay vì validates :foo, length: 2..5, allow_blank: truenhưng 'chiều dài: {là: 5} `sẽ làm gì trong trường hợp của OP
PhilT

3

mọi validates_ * đều chấp nhận: nếu hoặc: trừ khi các tùy chọn

validates_length_of :foo, :maximum => 5, :if => :validate_foo_condition

trong đó validate_foo_condition là phương thức trả về true hoặc false

bạn cũng có thể chuyển một đối tượng Proc:

validates_length_of :foo, :maximum => 5, :unless => Proc.new {|object| object.foo.blank?}

2
validates_length_of :reason, minimum: 3, maximum: 30

rspec cho cùng là

it { should validate_length_of(:reason).is_at_least(3).is_at_most(30) }

2

Làm thế nào về điều đó: validates_length_of :foo, is: 3, allow_blank: true


-1

Thêm vào mô hình của bạn:

validates :color, length: { is: 7 }

màu là một chuỗi:

t.string :color, null: false, default: '#0093FF', limit: 7

-4

Trong mô hình của bạn, ví dụ:

def validate
  errors.add_to_base 'error message' unless self.foo.length == 5 or self.foo.blanc?
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.