2012-09-06 206 views
0

我有一個文檔Design.rb,它有一個嵌入式文檔Attachment.rb,它做了一些驗證。如果Attachment.rb失敗,那麼Design.rb也應該失敗,但它不會。在Mongoid中驗證嵌入式文檔

有關如何讓我的設計類在嵌入文檔失敗時失敗的建議?

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 

回答

2

你可以嘗試添加

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

這將調用驗證時變化通過設計模型製作。