2011-08-15 53 views
0

我使用Ruby on Rails的3.0.9和2.3回形針。由於創業板回形針只提供兩個驗證方法(validates_attachment_presencevalidates_attachment_content_type)我想實現我的自定義的驗證方法。如何改進和運行自定義驗證方法?

在我的模型文件,我有只是以下驗證方法

def validates_avatar(attribute_name, file) 
    if file.nil? # file value is nil if no file is uploaded 
    self.errors.add("#{attribute_name}", "You must select a file") 
    else 
    self.errors.add("#{attribute_name}", "Avatar is an invalid image format") unless MIME_TYPES.include?(file.content_type) 
    self.errors.add("#{attribute_name}", "Avatar is too big" if ((file.size > AVATAR_FILE_MAX_SIZE.to_i) || (file.size == nil)) 
    end 

    return self.errors.empty? 
end 

,我從我的控制器以這種方式撥打:

if @user.validates_avatar(:avatar, params[:user][:avatar]) 
    ... 
end 

我想作出上述驗證運行\觸發所有其他Ruby on Rails的驗證方法以同樣的方式(如:作爲樣validates :title, :presence => true作品)。

我如何能做到這一點,我怎麼能提高,以處理化身驗證上面的代碼?

回答

3

它已經包含在Paperclip,它只是做同樣的工作。那麼你爲什麼要重複它呢?

class Avatar < ActiveRecord::Base 
    has_attached_file :file 
    validates_attachment_presence :file 
    validates_attachment_size :file, :less_than => 5.megabytes 
    validates_attachment_content_type :file, :content_type => ['image/jpeg', 'image/png'] 
end 

和控制器從未驗證 - 這是典型的工作。只是

@user = User.new(params[:user]) 
@user.save 

它不會救@user如果@user.avatar將無法​​通過驗證

1

你真的應該移動到的驗證模型。這裏有一個例子:

validate :avatar_should_be_valid 

def :avatar_should_be_valid 
errors.add(:base, "avatar is invalid!") if... 
end