【问题标题】:How to Show Error Messages Next to Field如何在字段旁边显示错误消息
【发布时间】:2013-02-26 02:17:42
【问题描述】:

我有一个带有输入字段/标签等的表单。如何让错误消息显示在该字段旁边?而不是在顶部聚集在一起?

我正在使用设计,rails 3

我的表单顶部有这个:

 = form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
- if resource.errors.any?
  #errorExplanation
    %h2
      = pluralize(resource.errors.count, "error")
      prevented this user from being saved:
    %ul
      - resource.errors.full_messages.each do |msg|
        %li
          = msg

【问题讨论】:

  • 好问题,但我认为 UJS 表单的答案并不优雅

标签: ruby-on-rails devise haml


【解决方案1】:

您可以使用 error_message_on http://apidock.com/rails/ActionView/Helpers/ActiveRecordHelper/error_message_on

更新:

form.error_messages 已从 Rails 中删除,现在可作为插件使用。请使用rails plugin install git://github.com/rails/dynamic_form.git安装。

【讨论】:

    【解决方案2】:

    你可以用这个

    - if @resource.errors[:field_name]
      ...
    

    也有用的链接:

    http://guides.rubyonrails.org/active_record_validations.html#working-with-validation-errors

    【讨论】:

    • 不错!看起来很棒!要得到消息,我会说 @resource.errors[:field_name].ful_messages 吗?
    • 谢谢,这会在一行上给我一个错误列表吗?我正在尝试执行 ffg:对于每个字段,如果该字段有错误,则为每个错误创建一个 div 并将其输出到该字段下方,或创建 1 个具有错误列表的 div,1 在另一个下方
    • 第 1 行必须有属性不能为空第 2 行必须有属性不能短于 5 个字符等
    • 是的,它会返回一行错误。您可以通过询问@resource.errors[:field_name].present? 来检查是否存在错误
    • 不是我真正需要的,我需要多行 - 我有这个 - 如果 resource.errors[:firstname].any? - resource.errors[:firstname].each do |msg| %div.error First name = msg ...这很好用,但我想把它放到一个助手中,这样我就不会在每个字段中重复它...
    【解决方案3】:

    只需在初始化程序文件夹中创建一个文件。

    config/initializers/inline_errors.rb

    把这段代码放进去:

    ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
      unless html_tag =~ /^<label/
        %{<div class="has-error">#{html_tag}<span class="help-block">#{instance.error_message.first}</span></div>}.html_safe
      else
        %{#{html_tag}}.html_safe
      end
    end
    

    PD:对不起我的英语。

    【讨论】:

    • 没有提供真实的描述来引导读者找到答案。不过这看起来超级有用。
    • 我放了一些文字来提供一些信息,我的英语不好,所以我之前没有写一些文字:/
    • 谢谢@el_quick。您是否有一个示例说明您如何在表单中使用它?我正在努力弄清楚您是如何实现这一点的。顺便说一句,我改变了我的评级。 :-)
    • 我认为field_error_proc 不是rails 的公共API 的一部分,因为它没有被记录。如果是私有的,这是一个危险的解决方案。
    【解决方案4】:

    这个怎么样

    如果您想将错误消息放在文本字段下方,您可以这样做

    .row.spacer20top
      .col-sm-6.form-group
        = f.label :first_name, "*Your First Name:"
        = f.text_field :first_name, :required => true, class: "form-control"
        = f.error_message_for(:first_name)
    

    什么是error_message_for
    --> 嗯,这是一个漂亮的 hack,可以做一些很酷的事情

    # Author Shiva Bhusal
    # Aug 2016
    # in config/initializers/modify_rails_form_builder.rb
    # This will add a new method in the `f` object available in Rails forms
    class ActionView::Helpers::FormBuilder
      def error_message_for(field_name)
        if self.object.errors[field_name].present?
          model_name              = self.object.class.name.downcase
          id_of_element           = "error_#{model_name}_#{field_name}"
          target_elem_id          = "#{model_name}_#{field_name}"
          class_name              = 'signup-error alert alert-danger'
          error_declaration_class = 'has-signup-error'
    
          "<div id=\"#{id_of_element}\" for=\"#{target_elem_id}\" class=\"#{class_name}\">"\
          "#{self.object.errors[field_name].join(', ')}"\
          "</div>"\
          "<!-- Later JavaScript to add class to the parent element -->"\
          "<script>"\
              "document.onreadystatechange = function(){"\
                "$('##{id_of_element}').parent()"\
                ".addClass('#{error_declaration_class}');"\
              "}"\
          "</script>".html_safe
        end
      rescue
        nil
      end
    end
    

    结果

    错误后生成的标记

    <div id="error_user_first_name" for="user_first_name" class="signup-error alert alert-danger">This field is required.</div>
    <script>document.onreadystatechange = function(){$('#error_user_first_name').parent().addClass('has-signup-error');}</script>
    

    对应的SCSS

      .has-signup-error{
        .signup-error{
          background: transparent;
          color: $brand-danger;
          border: none;
        }
    
        input, select{
          background-color: $bg-danger;
          border-color: $brand-danger;
          color: $gray-base;
          font-weight: 500;
        }
    
        &.checkbox{
          label{
            &:before{
              background-color: $bg-danger;
              border-color: $brand-danger;
            }
          }
        }
    

    注意:此处使用的引导变量 并且,在对配置目录中的文件进行任何修改之后,不要忘记重新启动服务器。

    【讨论】:

      【解决方案5】:

      如果有人正在寻找如何在 Rails 6 中为特定字段显示错误消息的方法:

      a = Post.new
      a.save # => false
      a.errors.full_messages_for(:title)
      ["Title can't be blank"]
      
      a.errors.full_messages_for(:title).join(', ')
      "Title can't be blank, Title too short"
      

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        相关资源
        最近更新 更多