我正在尝试使用简单的人/新页面来练习显示错误消息。现在,通过以下设置,错误消息显示正常,但看起来有点尴尬,因为文本说“名字不能为空”,“姓氏不能为空”等等。基本上我希望文本说“名字不能为空”和“姓氏不能为空”(带空格),但我假设错误信息只是跟随我在模型中定义的属性名称,并没有办法明确地改变这些。
那么我怎么能改变呢?如果不对这个特定的部分做出改变,我能否实现这一改变? (shared_error_messages)
谢谢, 以下新视图的屏幕截图。
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 %>
答案 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 %>