验证Mongoid中的嵌入文档

时间:2012-09-06 01:39:23

标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid

我有一个文档Design.rb,它有一个嵌入式文档Attachment.rb,可以进行一些验证。如果Attachment.rb失败,那么Design.rb也应该失败,但它不会失败。

如果嵌入式文档失败,有关如何让设计类失败的任何建议?

Design.rb:

class Design

    embeds_many :attachments, :as => :attachable

    validates_associated :attachments

    accepts_nested_attributes_for :attachments, :allow_destroy => true

    field :description
    field :title
    field :tags, type: Array
    field :featured, :type => Boolean, :default => false
    field :full_member, :type => Boolean, :default => false
    field :first_design, :type => Boolean, :default => false
    field :option, :type => String 
    field :app_store_url, :type => String 
    field :design_in_progress, :type => Boolean

    attr_accessible :design_in_progress, :tags, :description, :title, :featured, :project_number, :show, :option, :app_store_url, :temp_number, :option, :attachments_attributes

    validates :description, :tags, :title, :presence => true

end

Attachment.rb

require 'carrierwave/mongoid'

class Attachment

    embedded_in :attachable, :polymorphic => true, :inverse_of => :attachments

    field :image
    field :width, :type => Integer
    field :height, :type => Integer
    field :option, :type => String

    attr_accessible :image, :width, :height, :option, :normal, :url

    mount_uploader :image, ImageUploader

    validate :validate_minimum_image_size

    def validate_minimum_image_size
        self.option = self.attachable.option

        case self.option
        when "iphone"
            width = 640
            height = 960
            type = "iPhone"
        when "ipad"
            width = 1536
            height = 2048
            type = "iPad"
        when "icon"
            width = 1024
            height = 1024
            type = "Icon"
        when "wp" 
            width = 480
            height = 800
            type = "Windows Phone"
        when "android"
            width = 480
            height = 800
            type = "Android"
        end

        geometry = self.image.geometry
        unless geometry.nil?
            self.width = geometry[0]
            self.height = geometry[1]
        end

        unless (self.width == width && self.height == height)
            puts "INSIDE ERROR STATEMENT" 
            errors.add :base, "Naughty you... "+type+" designs should be "+width.to_s+"px times "+height.to_s+"px. We want to see your awesome design in retina :-)." 
        end
    end
end

1 个答案:

答案 0 :(得分:2)

您可以尝试添加

embeds_many :attachments, :as => :attachable, cascade_callbacks: true

当通过设计模型进行更改时,将调用验证。