使用simple_form自定义错误消息

9

我正在使用 simple_form 宝石包。当用户无法通过验证时,我想自定义显示的错误信息。我该如何实现这一点?


1
您想自定义错误消息还是错误消息的样式? - rubyprince
我最初是指错误消息的内容,但我也对自定义样式感兴趣。抱歉没有表达清楚。 - Justin Meltzer
4个回答

18
  1. 您可以在您的模型中声明错误消息的内容:

validates_length_of :name, :minimum => 5, :message => "blah blah blah"
你可以为错误标签设置 idclass:
<%= f.input :name, :error_html => { :id => "name_error"} %> 
  • 然后你可以使用CSS来进行样式设置。

  • 而且你可以使用

  • <%= f.error :name, :id => "name_error" %>
    

    你将得到

    <span class="error" id="name_error">is too short (minimum is 5 characters)</span>
    

    7

    我不知道对于simple_form gem是否有所不同。

    如果要更改错误消息的内容,您可以在模型中使用:message属性。

    class User < ActiveRecord::Base
      validates :email, {:presence => true, :message => "is not filled up."}
    end
    

    现在的验证消息将为电子邮件未填写。如果您还想更改字段名称(例如将电子邮件更改为电子邮件地址),则现在的方法是在locales.rb文件中定义,如下所示。
    # config/locales/en.yml
    en:
      activerecord:
        attributes:
          user:
            email: "E-mail address"
    

    请参考链接,了解有关locales的详细信息。另一种方法是在模型中定义人性化属性,如下所示:
    class User < ActiveRecord::Base
      validates :email, {:presence => true, :message => "is not filled up."}
      HUMANIZED_ATTRIBUTES = {
        :email => "E-mail address",
        ...(other fields and their humanized names)
        ...
      }
    
      def self.human_attribute_name(attr, options={})
        HUMANIZED_ATTRIBUTES[attr.to_sym] || super
      end
    
    end
    

    要定制验证信息的样式,我们需要编辑scaffold.css样式表中的#errorExplanation.fieldWithErrors的样式。


    4
    您可以轻松更改默认的错误消息,该消息在翻译文件中找到:config/locales/simple_form.en.yml
    在特定的初始化程序config/initializers/simple_form.rb中,您可以覆盖默认选项以生成html。
    希望这有所帮助。
    为了完整起见,我想补充一下:Formtastic是一个更容易开始使用的选择,因为它具有默认布局。我非常喜欢simple_form,但它不会提供任何格式化,但这是他们的意图。使用Formtastic很难(几乎不可能)更改生成的html,而使用simple_form则可以完全塑造生成的html以满足您的需求。如果您有设计师,并且需要生成相同的表单,则这尤其有用。因此,如果您要入门,Formtastic将更快地为您提供更漂亮的结果。还请注意,切换非常容易,因为语法几乎相同。

    如何更改 simple_form.en.yml 中默认错误信息的语法?如果对一个属性有两个验证,例如 :presence => true:format => ...,你该如何为每个提供不同的错误消息? - Justin Meltzer
    标准验证消息与simple_form无关,而是标准的ActiveRecord。您可以在验证中显式声明消息,或者您可以查看https://github.com/svenfuchs/rails-i18n,其中定义了标准消息(以及如何覆盖它们)。 - nathanvda
    有没有一种方法可以配置simple_form,将标签和错误消息链接到默认的activerecord i18n yaml? - Matthias
    您的问题并不十分清楚,请单独提出。另外,我也回答了一个有关如何在Simple Form中使用i18n标签的问题,他们在GitHub上的文档解释得非常好。 - nathanvda

    0

    还有一种解决方案在答案中没有提到,可以在表单本身中直接覆盖视图中的错误消息。例如:这里有详细说明。

    <%= f.input :last_name,
                   placeholder: 'last_name',
                   error: 'This is a custom error message',
                   required: true,
                   class: 'form-field',
                   autofocus: true,
                   input_html: { autocomplete: "last_name" } %>
    

    然而,这并不被建议,因为它不符合DRY原则,你需要在每个字段中都进行覆盖。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接