Сообщения об ошибках 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, а не сообщение "Контактная информация недействительна"?
Спасибо
Ответы
Ответ 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 не будет создан