6

私のフォームでは client_side_validations gem が非常にうまく機能しています。私は自分のユーザー モデルに Devise を使用しています。edit_user_registration フォームに移動すると、:current_password、:password、および :password_confirmation フィールドを除くすべての検証がスローされます。

たとえば、メールを空白のままにしておくと、タブでフィールドから出るとすぐに検証がポップアップします。ただし、 current_password フィールドを空白のままにして何も起こらない場合、フォームを送信すると、「1 エラーにより、このユーザーを保存できません: パスワードを空白にすることはできません」というエラーが表示されます。

助けてくれてありがとう

http://pastie.org/1907464

4

3 に答える 3

16

現在、ClientSideValidationsは条件付きバリデーターを除外します。Deviseは、いくつかのバリデーターを条件付きとして設定します:https ://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb#L24-32

私がこれを行った理由は、クライアントがその条件の真の値を決定するための良い方法がないためです。フォームの生成時にそれを行うことはできますが、その条件がフォームで変更できる値に依存している場合はどうなりますか?そこで、それらをフィルタリングして、サーバーにフォールバックさせることを選択しました。

それはアイデアでしたが、明らかにそれはいくつかのことに不当な制限を課しました。これは最も明白な(そして人気のある)ものです。

そのため、条件付きフィルターを明示的にオーバーライドできる新しいバージョンを間もなくリリースする予定です。これは次のように機能します。

<%= f.text_field :password, :validate => { :presence => true, :confirmation => true } %>

また

<%= f.text_field :password, :validate => true %>

最初のケースでは、フィルターをオフにするバリデーターを選択できます。2番目のケースでは、その属性のすべてのバリデーターのフィルターがオフになります。条件はフォームの生成時に評価され、フォームが渡されると、クライアントで使用するために入力要素にバリデーターが追加されます。

于 2011-05-18T06:04:52.070 に答える
4

マスターブランチがこの形式をサポートするようになりました。あなたのGemfileをそれに向けてください。

于 2011-05-20T06:27:40.203 に答える
0

それは簡単です!gem は Rails のデフォルト フォーム ビルダーを拡張し、インライン検証が必要な任意の form_for (または単純なフォーム ユーザーの場合は simple_form_for) タグに :validate => true オプションを設定するだけです。フォーム ビルダーは、モデルの検証でいくつかの Rails リフレクションを使用して、フォームの後にスクリプト タグに含まれる json を生成します。その後、json は gem の Javascript フレームワークによって使用され、実行する必要がある検証が実行されます。

<%= form_for(@user, :url => registration_path(resource_name), :validate => true) do |f| %>
于 2012-11-11T04:52:53.330 に答える