Reputation: 18871
I am using Ruby on Rails 3.0.9 and Paperclip 2.3. Since the Paperclip gem offers only two validation methods (validates_attachment_presence
and validates_attachment_content_type
) I am trying to implement my custom validation methods.
In my model file I have just the following validation method
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
that I call from my controllers in this way:
if @user.validates_avatar(:avatar, params[:user][:avatar])
...
end
I would like to make the above validation to run\to trigger the same way of all others Ruby on Rails validation methods (eg: as-like validates :title, :presence => true
works).
How can I do that and how can I improve the above code in order to handle avatar validations?
Upvotes: 0
Views: 317
Reputation: 83680
It is already included in Paperclip
and it do just the same job. so why do you want to repet it?
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
and never validate in Controller - it is Model job. Just
@user = User.new(params[:user])
@user.save
It won't save @user
if @user.avatar
won't pass validation
Upvotes: 3
Reputation: 5095
You should really move validations to a model. Here is an example:
validate :avatar_should_be_valid
def :avatar_should_be_valid
errors.add(:base, "avatar is invalid!") if...
end
Upvotes: 1