在View for Rails中创建更好的错误消息

时间:2014-05-31 23:23:54

标签: ruby-on-rails validation

我正在尝试使用简单的人/新页面来练习显示错误消息。现在,通过以下设置,错误消息显示正常,但看起来有点尴尬,因为文本说“名字不能为空”,“姓氏不能为空”等等。基本上我希望文本说“名字不能为空”和“姓氏不能为空”(带空格),但我假设错误信息只是跟随我在模型中定义的属性名称,并没有办法明确地改变这些。

那么我怎么能改变呢?如果不对这个特定的部分做出改变,我能否实现这一改变? (shared_error_messages)

谢谢, 以下新视图的屏幕截图。 enter image description here

people_controller.rb

class PeopleController < ApplicationController

def new
    @person = Person.new
    @people = Person.all
end

def create
    @person = Person.new(person_params)
    if @person.save
        redirect_to new_person_path
    else
        render 'new'
    end 
end

    private
      def person_params
        params.require(:person).permit(:firstname, :lastname, :age)
      end

end

person.rb

class Person < ActiveRecord::Base
    validates :firstname, presence: true, length: {maximum: 15}, format: { with: /\A[a-zA-Z]+\z/,
    message: "only allows letters" }
    validates :lastname, presence: true, length: {maximum: 15}, format: { with: /\A[a-zA-Z]+\z/,
    message: "only allows letters" }
    validates :age, presence: true, length: {maximum: 3}
end

new.html.erb

Enter your information
<hr>

<%= form_for @person do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  First Name: <%= f.text_field :firstname %><br>
  Last Name: <%= f.text_field :lastname %><br>
  Age: <%= f.number_field :age %><br>
  <%= f.submit "See Your Life Clock" %>
<% end %>

共享/ _error_messages

<% if object.errors.any? %>
<div id="error_explain">
  <h2><%= pluralize(object.errors.count, "error") %> prohibited this from being saved to DB</h2>
  <ul>
  <% object.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
</div>
<% end %>

2 个答案:

答案 0 :(得分:3)

假设您正在使用Rails 3.2或更高版本,那么&#34;最佳&#34;这样做的方法是本地化。编辑你的en.yml文件并添加:

en:
   activerecord:
      attributes:
         person:
            firstname: "First Name"
            lastname: "Last Name"

错误报告系统将从本地化文件中查找属性的人性化名称。这可能看起来很苛刻,但在我看来这是最好的方式,因为这些名称可以在任何地方访问,集中,易于维护。

如果您需要自己的代码中的友好名称(例如,在编辑表单上的标签或列表中的列标题中),您可以像这样访问它:

Person.human_attribute_name(:firstname)

现在,如果您更改了en.yml,则更改将反映在整个网站中。如果您需要本地化为另一种语言,那么您已经走上正轨。

如果这对您来说太过分了,您可以更改您的验证以获得完整的邮件句子,然后将您的_error_messages部分更改为:

<% if object.errors.any? %>
   <div id="error_explain">
     <h2><%= pluralize(object.errors.count, "error") %> prohibited this from being saved to DB</h2>
     <ul>
     <% object.errors.each do |attr, msg| %>
       <li><%= msg %></li>
     <% end %>
     </ul>
   </div>
<% end %>

答案 1 :(得分:0)

一个老问题,但可能是面临同样问题的人从中受益,所以我正在回答它。

在视图中,您使用First Name: <%= f.text_field :firstname %>之类的内容更好地使用以下内容,默认情况下会为您提供良好的字段名称。

<%= f.label :firstname, 'First Name' %><br>
<%= f.text_field :firstname %>