Подтвердить что ты не робот

Сообщения об ошибках 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

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

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

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

Спасибо

4b9b3361

Ответ 1

Здесь решение, которое я в конечном итоге придумал:

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

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

Ответ 2

Вместо того, чтобы возвращать 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

Ответ 3

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

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

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

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

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