Я пытаюсь настроить условный удаленный вызов с помощью стандартного плагина проверки jQuery.
Проблема в том, что когда я передаю имя.val() в методе проверки, оно всегда является именем, которое было установлено во входном текстовом поле при загрузке страницы. Это никогда не имя в текстовом поле.
Я заменил имя.val() на "Test", а затем скрипт работает безупречно. В консоли нет синтаксических ошибок или ошибок. Я также удалил вызов get_exists_rule (name.val()) и заменил его на простое обязательное: true, и это нормально. У меня есть эта настройка, работающая с другими формами с одинаковой схемой именования, без удаленных вызовов.
Я также бросил оповещение в get_exists_rule и независимо от того, что он запускается только один раз, когда загружается страница, поэтому может произойти смешное дело.
Я застрял на этом почти до 7 часов подряд, я посмотрел на каждую связанную с ним должность и везде, о которой я мог думать, и не нашел решения, которое работает.
Здесь кофейник:
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())
}
});
Выполните начальное правило так же, как и для 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
}
}
}
}
На стороне сервера сделайте что-то подобное на своем языке: вам нужно вернуть строку json "true" или "false".
if (post["category[name]"] == original_name)
return "true"
else
return category_exists(post["category[name]"])