2015-01-21 5 views
1

Я пытаюсь сделать форму, которая принимает только действительный адрес электронной почты или пустое электронное письмо. Я думаю, что это будет что-то вдоль этих линий:Как я могу позволить регулярному выражению быть пустым?

EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i OR "" 
validates :email, format: { with: EMAIL_REGEX } 

или, может быть,

EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
BLANK_REGEX = 
validates :email, format: { with: EMAIL_REGEX OR BLANK_REGEX } 

, но я не могу понять правильный синтаксис. Кто-нибудь знает правильный способ сделать это?

+0

@sawa Я не знал, спасибо. –

ответ

1

Подход, на который указывает @ avinash-raj, является совершенным. Однако вы можете использовать allow_blank: true в ваших валидациях. Ваш код должен быть таким:

validates :email, format: { with: /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i}, allow_blank: true 
1

Просто добавьте регулярное выражение, чтобы ваше регулярное выражение также соответствовало чистому электронному адресу.

EMAIL_REGEX = /\A(?:[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+)?\z/i 

ИЛИ

EMAIL_REGEX = /^(?:[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+)?$/i 

сделать регулярное выражение не обязательно, заключить все регулярные выражения внутри, не захватывая группы (?:...), а затем добавить ? рядом с этой группой.

+0

Не могли бы вы немного рассказать об этом? Как я могу сделать регулярное выражение необязательным? –

+0

, вы можете сделать это следующим образом: '^ (?: [\ W + \ -.] + @ [A-z \ d \ -.] + \. [A-z] + |) $'. '|' или оператор помогает сопоставить пустые строки. –