使用simple_form自定义错误消息

时间:2011-04-27 18:14:10

标签: ruby-on-rails ruby ruby-on-rails-3 validation error-handling

我正在使用simple_form gem。我想自定义用户验证失败时显示的错误消息。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:16)

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

    validates_length_of :name, :minimum => 5, :message => "blah blah blah"
    
  2. 您可以为自己设置idclass 错误标记:

    <%= f.input :name, :error_html => { :id => "name_error"} %> 
    

    然后您可以使用CSS进行样式设计。

  3. 您可以使用

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

    你会得到

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

答案 1 :(得分:5)

我不知道simple_form gem是否有任何不同。

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

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

现在验证邮件将是Email is not filled up。如果您希望更改字段名称(EmailE-mail address之类的内容),现在的方法是在locales.rb文件中定义它,就像这样

# config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"

有关locales的详细信息,请参阅link。另一种方法是在模型中定义人性化的属性,如:

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

为了自定义验证消息的样式,我们必须编辑样式 #errorExplanation样式表中的.fieldWithErrorsscaffold.css

答案 2 :(得分:3)

您可以轻松更改翻译文件中的默认错误消息,该文件位于config/locales/simple_form.en.yml

在特定的初始值设定项config/initializers/simple_form.rb中,您可以否决生成html的默认选项。

希望这有帮助。

为了完整性,我想补充一点,formtastic是一个更容易的选择,因为它有一个默认的布局。我非常喜欢simple_form,但它不提供任何开箱即用的格式,但这是他们的意图。使用Formtastic,很难(不可能)更改生成的html,而使用simple_form可以完全按照自己的喜好塑造生成的html。如果你有一个设计师,这个特别有用,你生成的表格必须生成相同的html。因此,如果您开始使用,formtastic将更快地为您提供更好看的结果。另请注意,切换非常容易,因为语法几乎相同。

答案 3 :(得分:0)

还有here中解释的另一种解决方案,答案中没有提到。您可以直接在表单本身中覆盖来自视图的错误消息。例如:

<%= 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,因此不建议这样做,您需要在每个字段中将其覆盖。