Сообщения об ошибках Rails/Mongoid во вложенных атрибутах

у меня есть класс контактной информации, определенный следующим образом:

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

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

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

однако, это не очень полезно для конечного пользователя, потому что он или она не знает, что контактная информация является недействительным. Реальное сообщение должно быть ' Name не может быть пустым'. Однако эта ошибка не распространяется вверх. Есть ли способ получить сообщение "имя не может быть пустым" внутри пользователя.ошибки вместо сообщения об ошибке "контактная информация недействительна"?

спасибо

3 ответов


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

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

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

вместо возврата пользователей.ошибки.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

в контроллере может быть решение...

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

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

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

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