我有一个如下定义的联系信息类:
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中的'Name not not blank'消息而不是'Contact info is invalid'错误消息?
由于
答案 0 :(得分:13)
这是我最终提出的解决方案:
将这些行添加到用户类
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
答案 1 :(得分:1)
而不是返回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
答案 2 :(得分:0)
涵盖每个嵌入式文档验证错误的我的解决方案如下:
after_validation :handle_post_validation
def handle_post_validation
sub_errors = ActiveModel::Errors.new(self)
errors.each do |e|
public_send(e).errors.each { |attr,msg| sub_errors.add(attr, msg)}
end
errors.merge!(sub_errors)
end
答案 3 :(得分:-2)
控制器中可能有一个解决方案......
在创建操作中,您可以添加类似
的内容 params[:portal_user][:contact_info_attributes] = {} if params[:portal_user] && params[:portal_user][:contact_info_attributes].nil?
这将强制contact_info创建,并将在右侧字段中触发错误
如果您不添加此项,则不会创建contact_info