【问题标题】:Rails client side validation working on submit action of all formsRails 客户端验证处理所有表单的提交操作
【发布时间】:2012-11-26 05:49:39
【问题描述】:

我正在使用 Rails 客户端验证 gem,版本 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

任何帮助将不胜感激。

【问题讨论】:

  • 我要问的问题是这些错误信息是否错误?或者您想关闭一般的错误消息?
  • 我想关闭一般的错误信息。具体来说,当我点击登录表单时,我不希望在文本字段之外出现任何错误消息。
  • 我认为这个 gem 的主要目的是显示除字段之外的错误消息。如果您不想显示它们,可能应该删除 gem。给我们更多的细节。如我所见,您的配置是正确的。
  • 是的,但是如果希望这些错误消息仅以某些形式显示而不以其他形式显示怎么办?有什么方法可以检查当前表单然后验证吗?
  • 现在我明白了,这是一个有趣的问题。 form_for 接受属性 :validation => true 以防您需要客户端验证。如果不通过 :validation => true ,则不使用。

标签: ruby-on-rails validation client-side-validation


【解决方案1】:

我不确定这样做是否正确,但我检查了实例是否响应 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

之前生成的代码可以在问题帖中看到。

【讨论】:

    【解决方案2】:

    只是为了扩展 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多