使用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的验证过程,我觉得应该有办法解决这个问题。
当前回答
Rails3 Code与完全本地化的消息:
在模型用户中。Rb定义验证
validates :email, :presence => true
在config locales /和. yml
en:
activerecord:
models:
user: "Customer"
attributes:
user:
email: "Email address"
errors:
models:
user:
attributes:
email:
blank: "cannot be empty"
其他回答
试试这个。
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
上面的代码来自这里
如果你想把它们都列在一个漂亮的列表中,但又不想使用不友好的名字,你可以这样做……
object.errors.each do |attr,message|
puts "<li>"+message+"</li>"
end
在你的模型中:
validates_presence_of :address1, message: 'Put some address please'
在你看来
<% m.errors.each do |attr, msg| %>
<%= msg %>
<% end %>
如果你这样做
<%= attr %> <%= msg %>
您将得到带有属性名的错误消息
address1 Put some address please
如果您想获取单个属性的错误消息
<%= @model.errors[:address1] %>
升级了@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 %>
这里有另一种方法:
如果你使用这个模板:
<% if @thing.errors.any? %>
<ul>
<% @thing.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
你可以像这样写你自己的自定义消息:
class Thing < ActiveRecord::Base
validate :custom_validation_method_with_message
def custom_validation_method_with_message
if some_model_attribute.blank?
errors.add(:_, "My custom message")
end
end
这样,由于下划线的存在,整个消息变成了“我的自定义消息”,但开头的额外空间是不明显的。如果你真的不想在开始的时候增加额外的空间,只需添加.lstrip方法。
<% if @thing.errors.any? %>
<ul>
<% @thing.errors.full_messages.each do |message| %>
<li><%= message.lstrip %></li>
<% end %>
</ul>
<% end %>
的字符串。Lstrip方法将删除':_'所创建的额外空格,并将保持任何其他错误消息不变。
或者更好的是,使用自定义消息的第一个单词作为键:
def custom_validation_method_with_message
if some_model_attribute.blank?
errors.add(:my, "custom message")
end
end
现在完整的消息将是“我的自定义消息”,没有额外的空间。
如果你想要完整的信息以一个大写的词开头,比如“URL不能为空”,这是不可能的。相反,试着添加一些其他的单词作为关键字:
def custom_validation_method_with_message
if some_model_attribute.blank?
errors.add(:the, "URL can't be blank")
end
end
现在完整的信息是" URL不能为空"