在哪里设置 rails 错误消息的模板?

Where do I set template for rails error messages?

我希望rails显示错误信息

Field <field name> can't be blank

但使用标准方法我得到

<field name> Field <field name> can't be blank

这是一个重现问题的最小示例:

rails new test
cd test
rails g scaffold user name
rake db:migrate

app/models/user.rb 添加验证:

class User < ActiveRecord::Base
  validates :name, presence: true
end

config/locale/en.yml 编辑为:

en:
  activerecord:
    attributes:
      user:
        name: "Name"
    errors:
      models:
        user:
          attributes:
            name:
              blank: "Field %{attribute} can't be blank"

在此之后启动服务器

rails s

将浏览器指向 http://localhost:3000/users/new 并按 "Create User" 按钮。你会得到:

显然,某处还有另一个模板,上面写着类似

的内容
%{attribute} %{message}

但我在 rails 代码中找不到它。

这是因为在脚手架 (views/users/_form.html.erb) 生成的标准视图中,您有:

<% user.errors.full_messages.each do |message| %>

这就是returns

Name Field Name can't be blank

相反,您可以修改 _form 视图并使用 user.errors.messages,其中您会得到一个散列,其中错误分配给表示字段的键:

@user.errors.messages
{:name=>["Field Name can't be blank"]}

要获得您期望的结果,您可以编写例如:

<% @user.errors.messages.values.flatten.each do |message| %>
  <li><%= message %></li>
<% end %>