2017-05-10 1 views
1

Modell validieren:Petersilie + Rails 5 + kann nicht E-Mail-Adresse

class User < ApplicationRecord 
    VALID_EMAIL_REGEX = /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i 
    validates :email, 
     presence: true, 
     format: { with: VALID_EMAIL_REGEX } 
end 

HTML:

<%= 
    f.email_field :email, 
    placeholder: 'email', 
    class: "form-control", 
    id:"user_email", 
    data: { 
    parsley_required: "", 
    parsley_pattern: User::VALID_EMAIL_REGEX, 
    parsley_type: "email" 
    } 
%> 

Nach Compile:

<input placeholder="email" class="form-control" id="user_email" data-parsley-required="" data-parsley-pattern="&quot;(?i-mx:\\A([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})\\z)&quot;" data-parsley-type="email" type="email" value="" name="user[email]"> 

Problem. Bitte schlagen Sie vor:

+0

JS RegExp unterstützt keine Inline-Modifizierer und '\ A' /' \ z'-Anker. Das "Daten-Petersilien-Muster" sollte auf "^ [^ @ \ s] + @ (?: [- A-Za-z0-9] + \.) + [Az] {2,} $" gesetzt werden. '. –

+0

Ersetzte Benutzerkonstante mit dem vorgeschlagenen Wert. Got ERROR activemodell-5.0.1/lib/active_model/validations/format.rb: 44: in 'check_options_validity ': Ein regulärer Ausdruck oder ein proc oder lambda muss angegeben werden als: with (ArgumentError) – Rubyist

+0

Siehe [JSFiddle] (http://jsfiddle.net/1tnevy0f/1/). –

Antwort

1

Der Beginn des String-Ankers in Ruby wird mit \A Operator definiert und das Ende des String-Ankers wird mit \z ausgedrückt. In JavaScript werden jedoch ^ und $ Anker verwendet. Wenn Sie außerdem das Ruby Regexp-Objekt an die JS-Parsley senden, wird #to_s darauf ausgeführt, und Sie erhalten das Muster gemischt mit Modifikatoren, die in ihrem Inline-Format, z. (?-im:).

Was Sie tun können, um den Wert von VALID_EMAIL_REGEX zu einem String wie '[^@\s][email protected](?:[-a-zA-Z0-9]+\.)+[a-z]{2,}' gesetzt ist (man beachte ich unnötige Erfassung Gruppen entfernt, wie Sie werden nicht jene submatches zugreifen, und auch nicht der Backslash ist Single, da die wörtliche a zitieren Sie die Regex dynamisch mit format: { with: Regexp.new("\\A#{VALID_EMAIL_REGEX}\\z") } (so sind die Anker für Ruby korrekt - die Backslashes werden verdoppelt, da es sich um ein doppeltes String-Literal handelt) und übergeben Sie die ^/$-Anker an Parsley JS mit parsley_pattern: "^"+User::VALID_EMAIL_REGEX + "$".

Resulting model: 

class User < ApplicationRecord 
    VALID_EMAIL_REGEX = '[^@\s][email protected](?:[-a-zA-Z0-9]+\.)+[a-z]{2,}' 
    validates :email, 
    presence: true, 
    format: { with: Regexp.new("\\A#{VALID_EMAIL_REGEX}\\z") } 
end 

und das resultierende HTML:

<%= 
    f.email_field :email, 
    placeholder: 'email', 
    id:"user_email", 
    data: { 
     parsley_required: "", 
     parsley_pattern: "^"+User::VALID_EMAIL_REGEX + "$", 
     parsley_type: "email" 
    } 
%> 

Nur für den Fall, hier ist ein Parsley JS fiddle.

0

Zusätzlich können Sie einfach data-parsley-type="email" anstelle von pattern verwenden. Dies verwendet den integrierten (und genaueren) Regex von Parsley für E-Mails.