Сообщения об ошибках всегда включают имя атрибута - PullRequest
9 голосов
/ 03 апреля 2011

При попытке отправить пустую форму появляются следующие сообщения об ошибках проверки:

Start time time Looks like you forgot the appointment start time.
Start time time Sorry, we can't understand "" as a time.
Start time ymd Please choose a date for the appointment.
Start time ymd Sorry, we can't understand "" as a date.
Stylist services Please choose at least one service.

Эти сообщения предназначены для следующих атрибутов:

start_time_time
start_time_time
start_time_ymd
start_time_ymd
stylist_services

Я включил имена атрибутов, чтобы вы могли ясно видеть, какая часть сообщения об ошибке является именем атрибута.

Как удалить имена атрибутов из сообщений об ошибках?

Ответы [ 4 ]

24 голосов
/ 26 июля 2012

В rails 3.2.6 вы можете подавить включение имени атрибута, установив error.format в файле локали (например, config / locales / en.yml):

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

В противном случае по умолчанию используется формат «% {attribute}% {message}».

20 голосов
/ 03 апреля 2011

Обычно выводится по циклу object.full_messages для вывода каждого полного сообщения:

<% if object.errors.any? %>
  <h2>Errors</h2>
  <ul>
  <% object.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
<% end %>

<h2>Errors</h2>
<ul>
  <li>Start time time Looks like you forgot the appointment start time.</li>
  <li>Start time time Sorry, we can't understand "" as a time.</li>
  <li>Start time ymd Please choose a date for the appointment.</li>
  <li>Start time ymd Sorry, we can't understand "" as a date.</li>
  <li>Stylist services Please choose at least one service.</li>
</ul>

Но «полное» сообщение состоит из локализованного имени поля, за которым следует сообщение (как вы уже видели; это потому, что сообщения обычно имеют вид «не может быть пустым»). Если вы просто хотите получить реальное сообщение об ошибке без имени поля, используйте вместо этого встроенный итератор each:

<% if object.errors.any? %>
  <h2>Errors</h2>
  <ul>
  <% object.errors.each do |field, msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
<% end %>

<h2>Errors</h2>
<ul>
  <li>Looks like you forgot the appointment start time.</li>
  <li>Sorry, we can't understand "" as a time.</li>
  <li>Please choose a date for the appointment.</li>
  <li>Sorry, we can't understand "" as a date.</li>
  <li>Please choose at least one service.</li>
</ul>
17 голосов
/ 03 апреля 2011

Можно использовать маршрут i18n для изменения отображаемого имени атрибута.

config / locales / en.yml:

en:
  activerecord:
    attributes:
      somemodel:
        start_time_time: My Start Time Text  #renamed text
        stylist_services: "" #hidden txet
0 голосов
/ 14 апреля 2011

Я сделал почти то же самое, что и Брэндон.

Сначала я написал вспомогательную функцию для объекта, для которого будут отображаться ошибки.

#Remove unnecessary attribute names in error messages
def exclude_att(attribute, error_msg)
  if attribute.to_s == "Put attribute name you don't want to see here"
    error_msg
  else
    attribute.to_s.humanize + " " + error_msg
  end
end

Затем в представлении, чтопроверял форму, я сделал: (Примечание: это код HAML, а не HTML, но теги все те же, так что вы можете ясно видеть, что я делаю)

%h3= "#{pluralize(@user.errors.count, 'error')} prohibited this user from being saved:"
  %ul
   - @user.errors.each do |att, error|
     %li= exclude_att(att, error)

Это было сделано дляя, никаких драгоценных камней или сторонних плагинов.

-Demitry

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...