2014-03-31 134 views
1

我有一個文件中的字段:驗證對於要上傳個人資料圖片的人的模型

<%= f.file_field :file %> 

而這一切都工作好,不過,我不知道如何驗證它。

這裏是我創造的動作,這一切都完美的工作,但分裂params哈希表像我這樣做可能是錯誤的:

def create 
    new_user_params = user_params 

    image_params = user_params[:profile_image_attributes] 
    new_user_params.delete("profile_image_attributes") 

    @user = User.new(new_user_params) 


    respond_to do |format| 
     if @user.save 

     @user.create_thumbnail(image_params) 

     sign_in @user 

     format.html { redirect_to @user, notice: 'Welcome to ' + request.host_with_port + ', ' + @user.user_name + '!' } 
     format.json { render action: 'show', status: :created, location: @user } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
end 

和這裏的user#create_thumbnail方法:

def create_thumbnail(data) 

    upload = data['file'].read 

    img = Magick::Image.from_blob(upload).first 

    img.resize!(75,75)  

    transaction do 

     self.create_profile_image(path: 'test') 

     img.write 'test' + '.' + img.format.downcase 

    end 
end 

問題:

就像這樣說,它一切正常,,但我想知道如何正確地做到這一點,最重要的是,如何阻止人們上傳大小不超過格式.gif,.png .jpg或.jpeg的大文件和文件以及相應的驗證錯誤消息...

回答

1

如果您打開添加一個新的寶石,然後我會強烈推薦使用流行的Paperclip寶石,內置驗證file size,content type/ extensionpresence

參考Paperclip Github文檔。

這將是的話說

validates_attachment :image, :presence => true, 
    :content_type => { :content_type => ["image/jpg", "image/jpeg", "image/gif", "image/png"] }, 
    :size => { :in => 0..10.kilobytes } 

對於那些使用命名image(回形針附件)領域的典範一樣簡單。

其中:

:presence驗證,雖然表單提交

:content_type void驗證文件擴展名(MIME類型)指定的文件附着。它還會檢查上傳文件的實際內容。請閱讀我的findings here

:size根據給定範圍驗證上傳的文件大小。

+0

@ user3067865我的回答有助於解決您的問題嗎?讓我知道。 –

0

如果您正在上傳文件,您可能需要使用PaperclipCarrierwave。他們都具有功能,可以輕鬆實現您遇到的問題。

回形針:

您可以使用該模型只會驗證:

validates_attachment_presence 
validates_attachment_content_type 
validates_attachment_size 

舊RailsCast特色回形針:http://railscasts.com/episodes/134-paperclip

Carrierwave:

有你指定的上傳類,並從那裏您可以添加文件類型和大小的驗證。

class MyUploader < CarrierWave::Uploader::Base 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

舊RailsCast特色Carrierwave:http://railscasts.com/episodes/253-carrierwave-file-uploads

0

爲什麼不使用寶石的,他們作爲carrierwave? https://github.com/carrierwaveuploader/carrierwave

如果你想用你的代碼,爲什麼不重構了一下,例如

我會做這樣的事情,使用一些設計模式。

def create_thumbnail 
    upload_file(read_file(data)) 
    resize_img 
    execute_transaction 
end 

def read_file(data) 
data['file'].read 
end 

def upload_file(read_file) 
    Magick::Image.from_blob(read_file).first 
end 

def resize_img 
upload_file.resize!(75,75) 
end 

def execute_transaction 
    transaction do 

     self.create_profile_image(path: 'test') 

     img.write 'test' + '.' + img.format.downcase 

    end 
end 
相關問題