0

Railsクライアント側検証gemバージョン3.2.1を使用しています。今、私は、これらの検証を適用したくないフォームに検証が適用されるという問題に遭遇しました。

サインアップとサインインについては、私の2つのフォームをご覧ください。

_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_inフォームではなく、sign_upフォームで機能するようにします。これらのフォームは両方とも、それぞれのコントローラーの「新しい」アクションに対して行われた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

どんな助けでも大歓迎です。

4

2 に答える 2

0

これが正しい方法かどうかはわかりませんが、インスタンスが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

以前に生成されたコードは、アンケートの投稿で見ることができます。

于 2012-11-26T07:58:10.637 に答える
0

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
于 2017-09-03T15:49:13.003 に答える