ruby-on-rails – rails错误消息显示键,我只想要值

我有以下代码来显示错误消息:

<% if @profile.errors.any? %>
    <% puts @profile.errors.full_messages.inspect.to_s %>
    <ul>
      <% @profile.errors.full_messages.each do |msg| %>
        <% puts 'errors ared' + msg.to_s %>
        <li><%= msg %></li>
      <% end %>
    </ul>
<% end %>

以下是模型中的验证:

validates :title, presence: true, length: {maximum: 50, minimum: 5, too_long: "Title cannot be longer than %{count} characters", too_short:" must be at least %{count} characters."}

出于某种原因,这会打印带有错误的属性名称和错误.例如,如果我试图通过更新名为“title”的表单字段来显示错误,则错误消息将显示为:

Title Title cannot be longer than 50 characters

我想在整个网站上显示许多错误消息,我不想自动编写任何内容.我如何在开头摆脱“标题”这个词?

最佳答案 full_messages方法将属性名称添加到验证错误消息中.

以下是rails中的方法实现

## Following code is extracted from Rails source code

def full_messages
      map { |attribute, message| full_message(attribute, message) }
end

def full_message(attribute, message)
      return message if attribute == :base
      attr_name = attribute.to_s.tr('.', '_').humanize
      attr_name = @base.class.human_attribute_name(attribute, default: attr_name)
      I18n.t(:"errors.format", {
        default:  "%{attribute} %{message}",
        attribute: attr_name,
        message:   message
      })
 end

如果你看到full_messages方法,它又调用full_messages,其中属性被添加到错误消息之前.
因此,如果您在验证错误消息中添加属性名称,它肯定会被复制,这就是您的情况.

简而言之,您不需要在验证消息中指定属性名称,因为rails已经在处理它.

编辑

没有什么是不可能的.如果您愿意,可以自定义如下

<% if @profile.errors.any? %>
    <ul>
      <% @profile.errors.messages.each do |attr, msg| %>
        <% msg.each do |val| %>
        <li><%= val %></li>
        <% end %>
      <% end %>
    </ul>
<% end %>
点赞