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

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

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

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


当前回答

如果在显示字段名时locale不同,那么Graywh的答案是最好的。对于动态字段名(基于要显示的其他字段),我将执行如下操作

<% object.errors.each do |attr, msg| %>
<li>
  <% case attr.to_sym %>
  <% when :song_rep_xyz %>
    <%= #display error how you want here %>
  <% else %>
    <%= object.errors.full_message(attr, msg) %>
  <% end %>
</li>
<% end %>

else方法中的full_message方法是rails在full_messages方法中使用的方法,因此它将在其他情况下给出正常的rails错误(rails 3.2及更高版本)

其他回答

一个解决方案可能是改变i18n的默认错误格式:

en:
  errors:
    format: "%{message}"

默认格式:%{attribute} %{message}

以下是我的代码,如果你仍然需要它,它可能对你有用: 我的模型:

validates :director, acceptance: {message: "^Please confirm that you are a director of the company."}, on: :create, if: :is_director?

然后我创建了一个helper来显示消息:

module ErrorHelper
  def error_messages!
    return "" unless error_messages?
    messages = resource.errors.full_messages.map { |msg|
       if msg.present? && !msg.index("^").nil?
         content_tag(:p, msg.slice((msg.index("^")+1)..-1))
       else
         content_tag(:p, msg)
       end
    }.join

    html = <<-HTML
      <div class="general-error alert show">
        #{messages}
      </div>
    HTML

    html.html_safe
  end

  def error_messages?
    !resource.errors.empty?
  end
end

如果你想把它们都列在一个漂亮的列表中,但又不想使用不友好的名字,你可以这样做……

object.errors.each do |attr,message|
  puts "<li>"+message+"</li>"
end

在自定义验证方法中使用:

错误。add(:base, "自定义错误消息")

因为add_to_base已弃用。

错误。add_to_base("自定义错误消息")

关于被接受的答案和列表中的另一个答案:

我正在确认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

你不能创建一个没有名称的项目