6

這是我的圖片模型,其中我已經實現了一個方法,用於驗證附件的尺寸:回形針圖片尺寸自定義的驗證

class Image < ActiveRecord::Base 
    attr_accessible :file 

    belongs_to :imageable, polymorphic: true 

    has_attached_file :file, 
        styles: { thumb: '220x175#', thumb_big: '460x311#' } 

    validates_attachment :file, 
         presence: true, 
         size: { in: 0..600.kilobytes }, 
         content_type: { content_type: 'image/jpeg' } 

    validate :file_dimensions 

    private 

    def file_dimensions(width = 680, height = 540) 
    dimensions = Paperclip::Geometry.from_file(file.queued_for_write[:original].path) 
    unless dimensions.width == width && dimensions.height == height 
     errors.add :file, "Width must be #{width}px and height must be #{height}px" 
    end 
    end 
end 

這工作得很好,但由於該方法採用固定值,它是不可重複使用寬度&高度。我想將其轉換爲自定義驗證器,因此我也可以在其他模型中使用它。我讀過有關這個導遊,我知道這會是這樣的應用程序/模型/ dimensions_validator.rb:

class DimensionsValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    dimensions = Paperclip::Geometry.from_file(record.queued_for_write[:original].path) 

    unless dimensions.width == 680 && dimensions.height == 540 
     record.errors[attribute] << "Width must be #{width}px and height must be #{height}px" 
    end 
    end 
end 

,但我知道我失去了一些東西的原因此代碼不能正常工作。問題是我想在我的模型中調用這樣的驗證:

validates :attachment, dimensions: { width: 300, height: 200}

關於如何實施驗證器的任何想法?

+1

我不確定,但我認爲你可以通過選項屬性訪問你的寬度和高度。就像:'options [:width]'和'options [:height]' –

回答

16

把這個在app /驗證/ dimensions_validator.rb:

class DimensionsValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    # I'm not sure about this: 
    dimensions = Paperclip::Geometry.from_file(value.queued_for_write[:original].path) 
    # But this is what you need to know: 
    width = options[:width] 
    height = options[:height] 

    record.errors[attribute] << "Width must be #{width}px" unless dimensions.width == width 
    record.errors[attribute] << "Height must be #{height}px" unless dimensions.height == height 
    end 
end 

然後,在模型中:

validates :file, :dimensions => { :width => 300, :height => 300 } 
+0

我們不必添加只要你將文件放在models /中,然後按照Rails約定(dimensions_validator.rb)命名,就可以將驗證器命名爲load_path。我編輯了答案。謝謝! – Agis

+0

我已經更新了答案.. –

+0

太好了。我們如何才能在圖片上傳時進行檢查?我試過一些東西,除非record.nil?和'除非value.nil?'但它不起作用。 – Agis