使用Rails我试图得到一个错误消息,如“歌曲字段不能为空”保存。做以下事情:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... 只显示“Song Rep XYW不能为空”,这是不好的,因为字段的标题不是用户友好的。如何更改字段本身的标题?我可以更改数据库中字段的实际名称,但我有多个“song”字段,我确实需要特定的字段名称。
我不想破坏rails的验证过程,我觉得应该有办法解决这个问题。
使用Rails我试图得到一个错误消息,如“歌曲字段不能为空”保存。做以下事情:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... 只显示“Song Rep XYW不能为空”,这是不好的,因为字段的标题不是用户友好的。如何更改字段本身的标题?我可以更改数据库中字段的实际名称,但我有多个“song”字段,我确实需要特定的字段名称。
我不想破坏rails的验证过程,我觉得应该有办法解决这个问题。
当前回答
升级了@Federico回答为所有字段错误的通用答案。
在你的控制器中。
flash[:alert] = @model.errors.messages.values
# [["field1_err1", "field1_err2"], ["field2_err1"], ["field3_err1"]]
与rails docs中一样,messages方法“返回属性的散列及其错误消息数组”。
然后,在表单中显示这些错误:
<% flash.each do |type, type_arr| %>
<% type_arr.each do |msg| %>
<ul>
<li>
<%= msg.to_sentence %>
</li>
</ul>
<% end %>
<% end %>
其他回答
试试这个。
class User < ActiveRecord::Base
validate do |user|
user.errors.add_to_base("Country can't be blank") if user.country_iso.blank?
end
end
我在这里找到了这个。
Rails 3到6的更新:
validate do |user|
user.errors.add(:base, "Country can't be blank") if user.country_iso.blank?
end
这是另一种方法。 您要做的就是在模型类上定义一个human_attribute_name方法。将列名作为字符串传递给该方法,并返回用于验证消息的字符串。
class User < ActiveRecord::Base
HUMANIZED_ATTRIBUTES = {
:email => "E-mail address"
}
def self.human_attribute_name(attr)
HUMANIZED_ATTRIBUTES[attr.to_sym] || super
end
end
上面的代码来自这里
现在,设置人性化名称和自定义错误消息的公认方法是使用区域设置。
# config/locales/en.yml
en:
activerecord:
attributes:
user:
email: "E-mail address"
errors:
models:
user:
attributes:
email:
blank: "is required"
现在已经更改了“email”属性的人性化名称和存在验证消息。
可以为特定的模型+属性、模型、属性或全局设置验证消息。
关于被接受的答案和列表中的另一个答案:
我正在确认nanamkim的custom-err-msg的分支与Rails 5和区域设置一起工作。
您只需要用一个插入符号开始locale消息,它不应该在消息中显示属性名称。
模型定义为:
class Item < ApplicationRecord
validates :name, presence: true
end
用下面的en.yml:
en:
activerecord:
errors:
models:
item:
attributes:
name:
blank: "^You can't create an item without a name."
item.errors。Full_messages将显示:
You can't create an item without a name
你不能创建一个没有名称的项目
一个解决方案可能是改变i18n的默认错误格式:
en:
errors:
format: "%{message}"
默认格式:%{attribute} %{message}
升级了@Federico回答为所有字段错误的通用答案。
在你的控制器中。
flash[:alert] = @model.errors.messages.values
# [["field1_err1", "field1_err2"], ["field2_err1"], ["field3_err1"]]
与rails docs中一样,messages方法“返回属性的散列及其错误消息数组”。
然后,在表单中显示这些错误:
<% flash.each do |type, type_arr| %>
<% type_arr.each do |msg| %>
<ul>
<li>
<%= msg.to_sentence %>
</li>
</ul>
<% end %>
<% end %>