Проверка на стороне клиента Rails работает над действием отправки всех форм

Я использую драгоценный камень проверки на стороне клиента rails, версия 3.2.1. Прямо сейчас я столкнулся с проблемой, когда проверки теперь применяются к формам, где я не хочу, чтобы эти проверки применялись.

Пожалуйста, найдите мои две формы, для регистрации и входа.

_sign_up_form.html.erb
<%= form_for(@user, :validate => true, :remote => true) do |f| %>

_sign_in_form.html.erb
<%= form_for(@user_session, :remote => true) do |f| %

Как вы могли видеть, я установил validate => true только в форме регистрации.

Я хочу, чтобы эти проверки на стороне клиента работали в форме sign_up, а не в форме sign_in. Обратите внимание, что обе эти формы загружаются после ajax-запросов к «новому» действию соответствующих контроллеров.

_sign_up_form.html.erb загружается, когда рендерится файл users/new.js.erb

*users/new/js.erb*
$("#static-form-modal .modal-body").html('<%= j(render(:partial => "users/sign_up_form"))%>');
$('form').live("click",function() {
$(this).enableClientSideValidations();
});

_sign_in_form.html.erb загружается при отображении user_sessions/new.js.erb

*user_sessions/new.js.erb*
$('#static-form-modal .modal-body').html('<%= j(render(:partial => "user_sessions/sign_in_form"))%>');

Проверка на стороне клиента работает отлично в форме регистрации, а сообщения об ошибках отображаются рядом с полями ошибок.

Проблема в том, что когда я нажимаю кнопку отправки в форме входа, эти сообщения об ошибках проверки появляются рядом с полями ошибок. Очевидно, что проверка на стороне сервера, но я не могу понять, как удалить эти сообщения об ошибках, появляющиеся рядом с полями ошибок.

Кроме того, я не простой формы. Я раскомментировал эти строки в файле initializers/client_side_validations.rb.

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  unless html_tag =~ /^<label/
    %{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
  else
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
  end
end

Любая помощь будет принята с благодарностью.


person Sunil    schedule 26.11.2012    source источник
comment
Вопрос, который я хотел бы задать, заключается в том, неверны ли эти сообщения об ошибках? Или вы хотели бы вообще отключить сообщения об ошибках?   -  person R Milushev    schedule 26.11.2012
comment
Я хотел бы отключить сообщения об ошибках в целом. Чтобы быть конкретным, когда я нажимаю на форму входа, я не хочу, чтобы появлялись какие-либо сообщения об ошибках, кроме текстовых полей.   -  person Sunil    schedule 26.11.2012
comment
Я думаю, что основная цель этого гема — отображать сообщения об ошибках помимо поля . Если вы не хотите их отображать, вероятно, следует удалить драгоценный камень. Дайте нам больше деталей. Как я вижу, ваша конфигурация верна.   -  person R Milushev    schedule 26.11.2012
comment
Да, но что, если вы хотите, чтобы эти сообщения об ошибках отображались только в определенных формах, а не в других? Есть ли способ проверить текущую форму, а затем подтвердить?   -  person Sunil    schedule 26.11.2012
comment
Теперь вижу, вопрос интересный. form_for принимает атрибут :validation =› true на случай, если вам нужна проверка на стороне клиента. Если вы не передадите :validation =› true , он не будет использоваться.   -  person R Milushev    schedule 26.11.2012
comment
Да, но здесь сообщения об ошибках проверки появляются после того, как я нажал кнопку отправки. Это проверка на стороне сервера, как я упоминал в посте, но это происходит после добавления инициализатора client_side_validations.rb, который генерируется генератором client_side_validations:install.   -  person Sunil    schedule 26.11.2012
comment
Вы можете попробовать закомментировать флэш-сообщения в вашем application.html.erb (или частичном, включенном туда).   -  person R Milushev    schedule 26.11.2012


Ответы (2)


Я не уверен, что это правильный способ сделать это, но я проверил, отвечает ли экземпляр на метод object_name, и соответствующим образом изменил свой код.

Пожалуйста, найдите отредактированный код.

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  if html_tag =~ /^<label/ or instance.respond_to?(:object_name)
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
  else
    %{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
  end
end

Сгенерированный ранее код можно было увидеть в сообщении с вопросом.

person Sunil    schedule 26.11.2012

Просто чтобы расширить уже исправленный Sunil, в случае, если вы используете Rubocop, он, вероятно, будет жаловаться на использование html_safe и рекомендует вместо этого использовать вспомогательный метод.

Вот как вы меняете код Sunil

ActionView::Base.field_error_proc = proc do |html_tag, instance|
    if html_tag =~ /^<label/
        ApplicationController.helpers.raw("<div class='field_with_errors'>#{html_tag}</div>")
    else
        ApplicationController.helpers.raw("<div class='field_with_errors'>#{html_tag}<label for='#{instance.send(:tag_id)}' class='message'>#{instance.error_message.first}</label></div>")
    end
end
person Frank Etoundi    schedule 03.09.2017