2011-04-06 56 views
3

我有一個帶回形針的rails 3應用程序。如果附件是圖片,並且圖片寬度或高度低於100,我想跳過保存。PaperClip - 如何跳過基於尺寸保存的附件

我在模型如下:

validate :file_dimensions, :unless => "errors.any?" 

    def file_dimensions 
    dimensions = Paperclip::Geometry.from_file(attachment.to_file(:original)) 
    if dimensions.width < 100 || dimensions.height < 100 
     errors.add(:file,'Width or height must be at least 100px') 
    end 
    end 

問題是,我不希望引發錯誤,因爲那時整個作業失敗,我只是想回形針跳過被保存的附件,不停止整個過程。

回答

1

來救你的要求,你不希望引發錯誤,這樣你就可以節省。在這種情況下,只使用一個:before_validate回調:

before_validate :check_file_dimensions 

def check_file_dimensions 
    if attachment.dirty? 
    dimensions = Paperclip::Geometry.from_file(attachment.to_file(:original)) 
    if dimensions.width < 100 || dimensions.height < 100 
     attachment.clear 
    end 
    end 
end 

當然,如果你想顯示錯誤信息給用戶,你需要通過一個實例VAR或某事(很明顯,你不能用錯誤傳遞或者它不會保存)。

attachment.dirty?上面的行是一個小的增強功能,以便您每次保存模型時都不會經常檢查附件,而只是在上傳新附件時。如果您在S3上存儲文件,這一點尤其重要。

+0

我從':before_validate'得到了'method_missing'錯誤。我最終使用':before_validation'來獲得相同的功能。 http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000064 – 2011-11-07 21:39:47

0

爲什麼你不想保存它?如果你希望它繼續下去,那麼一個簡單的解決方案就是不要使它成爲驗證,但可以像before_save,before_create或after_save回調一樣將其放入。

可能最簡單的事情是在before_save中,如果它不通過測試,只是刪除它,然後保存。

0

用戶可於ActiveRecord::RecordInvalid