Сообщения об ошибках Rails / Mongoid во вложенных атрибутах - PullRequest
14 голосов
/ 31 марта 2011

У меня есть класс контактной информации, определенный так:

class ContactInfo
  include Mongoid::Document

  validates_presence_of :name, :message => ' cannot be blank'

  field :name, :type => String
  field :address, :type => String
  field :city, :type => String
  field :state, :type => String
  field :zip, :type => String
  field :country, :type => String
  embedded_in :user
end

Этот класс контактной информации встроен как вложенный атрибут в мой класс пользователя:

class PortalUser
  include Mongoid::Document
  accepts_nested_attributes_for :contact_info
end

Когда я пытаюсь сохранить пользователя без имени, я получаю сообщение об ошибке, подобное этому:

Контактная информация недействительна

Однако, это не очень полезно для конечного пользователя, потому что он или она не знает, какая контактная информация недействительна. РЕАЛЬНОЕ сообщение должно быть «Имя не может быть пустым». Однако эта ошибка не распространяется вверх. Есть ли способ получить сообщение «Имя не может быть пустым» внутри user.errors вместо сообщения об ошибке «Контактная информация неверна»?

Спасибо

Ответы [ 3 ]

13 голосов
/ 01 апреля 2011

Вот решение, которое я в конце концов придумал:

Добавил эти строки в класс пользователя

after_validation :handle_post_validation
def handle_post_validation
  if not self.errors[:contact_info].nil?
    self.contact_info.errors.each{ |attr,msg| self.errors.add(attr, msg)}
    self.errors.delete(:contact_info)
  end
end
1 голос
/ 21 марта 2012

Вместо возврата user.errors.full_messages создайте специальный метод сообщения об ошибке для вашей пользовательской модели, где вы обрабатываете все ошибки встроенного документа.

class PortalUser
  include Mongoid::Document
  accepts_nested_attributes_for :contact_info
  def associated_errors
    contact_info.errors.full_messages unless contact_infos.errors.empty?
  end
end

и в вашем контроллере

flash[:error] = user.associated_errors
0 голосов
/ 17 апреля 2011

Возможно, в контроллере есть решение ...

В действии создания вы можете добавить что-то вроде

params[:portal_user][:contact_info_attributes] = {} if params[:portal_user] && params[:portal_user][:contact_info_attributes].nil?

Это заставит создание contact_info,и вызовет ошибку в правом поле

Если вы не добавите это, contact_info не будет создан

...