0

標準の jquery 検証プラグインを使用して条件付きリモート呼び出しをセットアップしようとしています。

問題は、validate メソッドで name.val() を渡すと、ページの読み込み時に入力テキスト フィールドに設定された名前が常に表示されることです。テキスト ボックスの名前ではありません。

name.val() を「Test」に置き換えると、スクリプトは問題なく動作します。コンソールに構文エラーやエラーはありません。get_exists_rule(name.val()) への呼び出しも削除し、単純な required: true に置き換えましたが、問題ありません。このセットアップは、同じ命名スキームを持つ他のフォームで機能していますが、リモート呼び出しはありません。

また、get_exists_rule に警告メッセージを投げましたが、ページが読み込まれたときに 1 回しか実行されないため、面白いビジネスが行われている可能性があります。

私はこれに7時間近く立ち往生しており、関連するすべてのSO投稿と、考えられるすべての場所を調べましたが、機能する解決策が見つかりませんでした.

コーヒースクリプトは次のとおりです。

  name = $("#category_name")

  get_exists_rule = (category_name) ->
    if original_name is category_name
      required: true
      maxlength: 64
    else
      remote: { url: "/dashboard/categories/exists/" + title_to_slug(category_name), type: "POST", async: false }

  category_form.validate
    errorElement:
      "span"
    rules:
      "category[name]":
        get_exists_rule(name.val())

これがJavaScriptです:

var get_exists_rule, name;

name = $("#category_name");

get_exists_rule = function(category_name) {
  if (original_name === category_name) {
    return {
      required: true,
      maxlength: 64
    };
  } else {
    return {
      remote: {
        url: "/dashboard/categories/exists/" + title_to_slug(category_name),
        type: "POST",
        async: false
      }
    };
  }
};

category_form.validate({
  errorElement: "span",
  rules: {
    "category[name]": get_exists_rule(name.val())
  }
});
4

1 に答える 1

2

初期ルールは、category_name === original_name の場合と同じにします。次に、category_name が変更されたら、リモート ルールを追加します。

このようなもの:

$('#category_name').on('change', function() {
  $( "#category_name" ).rules( "add", {
    remote: {
      url: "/dashboard/categories/exists/" + title_to_slug(category_name),
      type: "POST",
      success: function(exists) {
        if(title_to_slug(category_name) === original_name) {
          return true;
        else {
          return exists;
        }
      }
    }
  });
});

編集

変更時にルールを追加する代わりに、バリデーターのリモート ルールをデフォルトで使用するソリューション。

rules: {
  "category[name]": {
    required: true
    maxlength: 64
    remote: {
      url: "/dashboard/categories/valid_category",
      type: "POST",
      data: {
        "category[name]": function() { 
           return title_to_slug(name.val());
        },
        original_name: original_name
      }
    }
  }
}

サーバー側では、言語で次のようにします。「true」または「false」の json 文字列を返す必要があります。

if (post["category[name]"] == original_name)
  return "true"
else 
  return category_exists(post["category[name]"])
于 2013-09-25T20:22:03.213 に答える