2011-03-31 126 views
12

我有这样定义的联系人信息类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中的'名称不能为空'消息,而不是'联系信息无效'的错误信息?

感谢

+0

蒙戈有这个内置的,validates_associated。请参阅http://stackoverflow.com/questions/5078661/field-for-and-nested-form-with-mongoid – 2012-09-25 21:59:29

+1

validates_associated只验证关联的模型,但它仍然吐出无用的错误消息。 – UrLicht 2013-09-16 21:43:53

回答

11

这是我最终想出了解决方案:

增加这些线路和用户类

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 
+0

Mongo具有内置的'validates_associated'。请参阅http://stackoverflow.com/questions/5078661/field-for-and-nested-form-with-mongoid – 2012-09-25 21:59:16

+0

请注意,此代码会将嵌套属性添加到错误数组的末尾。 – Nobu 2014-02-11 22:35:59

-2

有可能是在控制器的解决方案......

在创建动作中你可以添加类似于

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

这将迫使contact_info创造,将触发右外场

错误如果不加这个,不创建

1

contact_info代替返回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