2015-05-15 4 views
0

Я пытаюсь реализовать валидацию в своей форме html, чтобы выделить входы формы с классом bootstrap has-error, если пользователь вводит неверные данные в моем приложении rails. Я использую ajax с пользовательским data объектом, который содержит сообщения об ошибках. До сих пор я придумал это:jQuery .closest() возвращает несколько результатов

application.js

jQuery.each(data.messages, function(i, val){ 
    $("label").val(i).closest("form-group").addClass("has-error"); 
    }); 

_account.html.erb

<div class="form-group"> 
<%= account_form.label(:label, "Label") %> 
<%= account_form.text_field(:label, class: "form-control") %> 
</div> 
<div class="form-group"> 
<%= account_form.label(:iban, "Iban") %> 
<%= account_form.text_field(:iban, class: "form-control", maxlength: 29, data: {toggle: "tooltip"}) %> 
</div> 
<div class="form-group"> 
<%= account_form.label(:swift, "Swift") %> 
<%= account_form.number_field(:swift, class: "form-control", maxlength: 8, data: {toggle: "tooltip"}) %> 
</div> 

Например, i = "swift" и val = "is blank", так что если пользователь предоставляет ярлык, но забывает о двух других, только "swift" и "iban" будет в i.

Моя проблема заключается в том, что для каждого цикла .each делает, .closest возвращает все 3 дивы, так что я не могу управлять, чтобы выбрать один DIV, основанный на этикетке с .closest

+2

Он возвращает три '.form-group' элементов, потому что вы выбрали * все *' элементы label' (из которых есть три) –

+0

То, что я имел в виду, что каждый цикл выбирает все 3 div каждый раз, в то время как каждый цикл должен выбирать только его родительский div – SORRROW

ответ

1

попробовать это: -

jQuery.each(data.messages, function(i, val){ 
    $("label:contains('"+i+"')").closest("form-group").addClass("has-error"); 
}); 

или это будет соответствовать всему тексту: -

jQuery.each(data.messages, function(i, val){ 
    var lbl=$('label').filter(function() { 
     return $(this).text().toLowerCase()==i.toLowerCase(); 
    }).first(); 
    lbl.closest(".form-group").addClass("has-error"); 
}); 
+0

Это не работает, я изолировал '$ (" label: contains ('"+ i +"') ")', чтобы видеть, и он не выбирает метки соответственно, он ничего не выбирает. – SORRROW

+0

Ваш второй код действительно работает, мне нужно было добавить '.'to' .closest (« form-group »), потому что я забыл поставить его сам в свой вопрос, но он, кажется, добавляет только класс has-error спасибо соответствующим divs, спасибо. – SORRROW

+0

@SORRROW sry моя ошибка да, вам нужно добавить '.' i.e class selector –

0

Так как вы хотите, чтобы выбрать метки, текст которых присутствует в data.messages объект Я думаю, вы можете попробовать

$('.form-group label').filter(function() { 
    return !!data.messages[$(this).text().trim()]; 
}).closest("form-group").addClass("has-error"); 
+0

Я попытался запустить ваш код, но он ничего не делает. – SORRROW

Смежные вопросы