2009-07-16 42 views
9

Tôi muốn xác thực người dùng của mình, vì vậy họ chỉ có thể sử dụng a-z và - trong tên người dùng của họ.Xác thực: Chỉ chữ cái, số và -

validates_format_of :username, :with => /[a-z]/ 

Tuy nhiên quy định này cũng cho phép không gian ._ @

Username should use only letters, numbers, spaces, and [email protected] please. 

Bất kỳ ý tưởng?

Trân trọng. Asbjørn Morell

+0

Đây là những gì tôi đã đưa ra: validates_format_of: username,: với =>/^ [- az \ d _] + $/ – atmorell

+0

Khi bạn có một câu trả lời giải quyết vấn đề của bạn, bạn nên đánh dấu nó là chấp nhận. –

Trả lời

3

Các [] có thể chứa một số "quy tắc" để [a-z0-9] cho chữ thường và số

các ký tự đặc biệt - phải đi vào lúc bắt đầu của sự cai trị

Liệu

[[email protected]_.] 

cho hiệu quả bạn muốn?

+0

[-A-Za-z0-9 @ _.] <- với chữ hoa, chỉ trong trường hợp. – beggs

+0

anh ta chỉ yêu cầu a-z ;-) – djna

+0

Tôi thà đánh dấu nó là trường hợp không nhạy cảm. – Svish

16

Bạn có thể cần phải nói toàn bộ chuỗi phải khớp với nhau:

validates_format_of :username, :with => /^[-a-z]+$/ 

Bạn cũng có thể cần phải thay thế^với \ A và $ với \ Z, nếu bạn không muốn để phù hợp với một dòng mới vào bắt đầu/kết thúc. (nhờ BaroqueBobcat)

Gắn thêm i sẽ khiến nó khớp với cách phân biệt chữ hoa chữ thường. (nhờ Omar Qureshi).

(Tôi cũng ban đầu rời khỏi +: nhờ Chuck)

+5

đã đồng ý nhưng vì/^ [- a-z] $/i đối với trường hợp không nhạy cảm –

+0

Ví dụ bạn luôn trả về không hợp lệ:/ – atmorell

+0

kiểm tra trong irb .. re =/^ [- a-z] $/i; "foo" = ~ re –

0

Đơn giản chỉ cần thay đổi các biểu thức chính quy để phù hợp với tất cả các nhân vật quốc gia đặc tả của bạn (\w bao gồm tất cả ký tự chữ - chữ và số - và một dấu gạch dưới) .

validates_format_of :username, :with => /[\w \.\[email protected]]+/ 
+0

Ví dụ của bạn khá gần nhưng người dùng vẫn có thể sử dụng. và không gian. của tôi ....... người dùng mới – atmorell

+0

Không có giới hạn ở đây để ngăn chặn chuỗi dài hơn phù hợp. Điều này sẽ khớp với bất kỳ chuỗi nào chứa ít nhất một trong các ký tự phù hợp. –

1
validates_format_of :username, :with => /^[\w\[email protected]]*$/ 

Lưu ý *, có nghĩa là '0 hoặc nhiều'

+0

Cùng một vấn đề ... không gian và. vẫn được phép:/ – atmorell

9

Nhiều giải pháp phức tạp nhưng tái sử dụng và với thông điệp lỗi hạt mịn hơn.

Tuỳ chỉnh validator:

app/xác nhận/username_convention_validator.rb

class UsernameConventionValidator < ActiveModel::EachValidator 
    def validate_each(record, field, value) 
    unless value.blank? 
     record.errors[field] << "is not alphanumeric (letters, numbers, underscores or periods)" unless value =~ /^[[:alnum:]._-]+$/ 
     record.errors[field] << "should start with a letter" unless value[0] =~ /[A-Za-z]/ 
     record.errors[field] << "contains illegal characters" unless value.ascii_only? 
    end 
    end 
end 

(Chú ý nó cho phép - và doesnt cho phép phi ascii, cho đầy đủ vì '_').

Cách sử dụng:

app/models/user.rb

validates :name, 
    :presence => true, 
    :uniqueness => true, 
    :username_convention => true 
+1

Câu trả lời hay - nó đi thêm một dặm. –

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