使用Rails我试图得到一个错误消息,如“歌曲字段不能为空”保存。做以下事情:

validates_presence_of :song_rep_xyz, :message => "can't be empty"

... 只显示“Song Rep XYW不能为空”,这是不好的,因为字段的标题不是用户友好的。如何更改字段本身的标题?我可以更改数据库中字段的实际名称,但我有多个“song”字段,我确实需要特定的字段名称。

我不想破坏rails的验证过程,我觉得应该有办法解决这个问题。


当前回答

在你看来

object.errors.each do |attr,msg|
  if msg.is_a? String
    if attr == :base
      content_tag :li, msg
    elsif msg[0] == "^"
      content_tag :li, msg[1..-1]
    else
      content_tag :li, "#{object.class.human_attribute_name(attr)} #{msg}"
    end
  end
end

当你想重写错误消息而不带属性名时,只需在消息前面加上^ like:

validates :last_name,
  uniqueness: {
    scope: [:first_name, :course_id, :user_id],
    case_sensitive: false,
    message: "^This student has already been registered."
  }

其他回答

现在,设置人性化名称和自定义错误消息的公认方法是使用区域设置。

# config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "is required"

现在已经更改了“email”属性的人性化名称和存在验证消息。

可以为特定的模型+属性、模型、属性或全局设置验证消息。

我建议安装David Easley最初编写的custom_error_message gem(或作为插件)

它可以让你做以下事情:

validates_presence_of :non_friendly_field_name, :message => "^Friendly field name is blank"

用正常的方式做就好:

validates_presence_of :email, :message => "Email is required."

但是要像这样显示它

<% if @user.errors.any? %>
  <% @user.errors.messages.each do |message| %>
    <div class="message"><%= message.last.last.html_safe %></div>
  <% end %>
<% end %>

返回

"Email is required."

本地化方法绝对是做到这一点的“正确”方法,但如果你做的是一个小的、非全局的项目,并且想要快速进行——这肯定比文件跳转更容易。

我喜欢它的能力,把字段名放在其他地方,而不是字符串的开始:

validates_uniqueness_of :email, :message => "There is already an account with that email."

升级了@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 %>

在你的模型中:

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] %>