Как я могу хранить дополнительные данные с сообщением об ошибке проверки в Rails 3? - PullRequest
2 голосов
/ 16 мая 2011

Я пытаюсь сохранить некоторые дополнительные данные вместе со стандартным сообщением об ошибке в пользовательском валидаторе в Rails 3.

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

class Post < ActiveRecord::Base

  # prevent duplicate posts
  validate do |post|
    duplicates = Post.find_all_by_body(body)
    errors.add_to_base("Post is a duplicate!") if duplicates.length

    # something like this is desired:
    # errors.add_to_base("Post is a duplicate",
    #  :extra => { :duplicates => duplicates })
  end

end

Это позволит пользователю знать, что есть дубликаты, но наряду с добавлением сообщения об ошибке я также хотел бы сохранить дубликаты, чтобы они могли отображаться вПользователь.Как сохранить список повторяющихся записей, извлеченных во время проверки, чтобы он ассоциировался с ошибками записи для поля body и был доступен для моего просмотра?

Более простым примером может быть проверка длины: еслиполе превышает его максимальную длину, как я могу сохранить максимальную длину вместе с сообщением об ошибке, не просто вставляя его в сообщение, как это делает Rails в настоящее время?

Ответы [ 2 ]

3 голосов
/ 16 мая 2011

Раньше мне не приходилось это делать, но моя первая мысль - создать новый метод для объекта под названием duplicates.

attr_accessor :duplicates

Затем в вашем пользовательском методе проверки вы можете установить дубликаты наобъект, делающий их доступными для просмотра при отображении ошибок.Обратите внимание, что ваш текущий код не сильно меняется:

validate do |post|
  duplicates = Post.find_all_by_body(body)
  errors.add_to_base("Post is a duplicate!") if duplicates.size > 0
end

Затем вам нужно будет перехватить эту ошибку в представлении вручную, чтобы вы могли распечатать все дубликаты, если «Сообщение является дубликатом!»ошибка обнаружена.

2 голосов
/ 16 мая 2011

Вы можете передать опции в ошибку, но они используются только в качестве замены в шаблонах i18n. Короче говоря, нет, вы не можете хранить метаданные о вашей ошибке в хеше ошибок. Если вам нужна такая функциональность, вам нужно заглянуть в модуль ActiveModel :: Errors в ядре Rails.

Обновление: Другое решение может состоять в том, что вместо того, чтобы вставлять строку в хэш ошибки, вы заполняете экземпляр своего собственного класса, класса, который крякает как строку, но будет украшен дополнительными методами и состоянием и т.

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