2017-05-10 10 views
1
を検証することができません5 +

モデル:パセリ+ Railsの電子メールアドレス

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" 
    } 
%> 

コンパイル後:

<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]"> 

働いていません。提案してください

+0

JS RegExpはインライン修飾子と '\ A' /' \ z'アンカーをサポートしていません。 '' data-parsley-pattern''は ''^[^ @ s] + @(?:[-A-Za-z0-9] + \)に設定する必要があります。+ [az] {2、} $ " '。 –

+0

ユーザー定数を推奨値に置き換えました。 44: 'check_options_validity 'で:正規表現またはPROCまたはラムダとして供給されなければならない(例外ArgumentError)と – Rubyist

+0

([JSFiddle]参照ERROR activemodel-5.0.1/LIB/active_model /検証/ format.rbを得http://jsfiddle.net/1tnevy0f/1/)。 –

答えて

1

Rubyでの文字列アンカーの開始は、\Aという演算子で定義され、文字列アンカーの終わりは\zで表されます。ただし、JavaScriptでは^$のアンカーがそれぞれ使用されます。さらに、Ruby RegexpオブジェクトをJS Parsleyに送信すると、#to_sが実行され、インラインフォームに追加された修飾子が混在するパターンが得られます。 (?-im:)。 (注意あなたがそれらのサブマッチにアクセスするつもりはない、とリテラルであるため、また、バックスラッシュは単一ではないとして、私は不必要なキャプチャグループを削除'[^@\s][email protected](?:[-a-zA-Z0-9]+\.)+[a-z]{2,}'よう文字列VALID_EMAIL_REGEXの値を設定して何ができる

それはリテラル二重引用符で囲まれた文字列であるので、バックスラッシュを2倍している)とパセリJSに^/$アンカーを渡す - (したがって、アンカーは、Ruby用の正しいformat: { with: Regexp.new("\\A#{VALID_EMAIL_REGEX}\\z") }とRoRの部分に動的正規表現を構築し、次にいずれかを引用シングル)、および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 

、そして得られたHTML:

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

念のため、ここでのParsley JS fiddleです。

0

さらに、patternの代わりにdata-parsley-type="email"を使用することもできます。これは電子メールのためのParsleyの組み込みの(そしてより正確な)正規表現を使用します。

関連する問題