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