2011-03-01 137 views
1

剛剛開始使用carrierwave和Rails,事情一直在順利進行,只有一個小例外。我創建了一個「ImageUploader」類,它看起來如此:Rails Carrierwave White_List沒有拋出異常

class ImageUploader < CarrierWave::Uploader::Base 

include CarrierWave::RMagick 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

和一個控制器的動作看起來像這樣:

def update 
    @user = current_user 
    if params[:user].nil? || params[:user][:image].nil? 
    redirect_to user_path(@user) 
    else 
    if @user.update_attribute(:image, params[:user][:image]) 
     flash[:success] = "Profile updated successfully!" 
     redirect_to user_path(@user) 
    else 
     flash[:error] = "Changes could not be saved." 
     render :action => 'edit' 
    end  
    end 
end 

在這種情況下,我安裝上載在我User.rb像這樣:

mount_uploader :image, ImageUploader 

問題是,根據Carrierwave README,帶有不在extensions_white_list中的擴展名的上傳文件應該使記錄無效。在我的情況下,我故意通過上傳帶有不在白名單上的各種擴展名的文件來測試應用程序,並且沒有提出任何錯誤。實際上,@ user.update_attribute似乎已通過,我通常使用flash [:success]消息重定向到user_path(@user)。圖像本身並沒有真正改變,但我希望能夠捕捉到錯誤,並在錯誤的擴展類型的情況下重定向到「編輯」頁面。關於我在這裏做錯的任何想法?

回答

1

對於任何有興趣的人,我都會爲自己找到解決方法。沒有最完美的解決方案,但在任何情況下,這裏是爲我工作:

@user.image = params[:user][:image] 
if @user.image_integrity_error 
    flash[:error] = "Changes could not be saved." 
    @user.errors.add(:upload, @user.image_integrity_error) 
    render 'edit' 
else 
    @user.update_attribute(:image, @user.image) 
    flash[:success] = "Profile updated successfully!" 
    redirect_to user_path(@user) 
end 
0

FYI的CarrierWave文檔指出以下幾點:

活動記錄驗證使用的Rails框架的國際化。將這些密鑰添加到您的翻譯文件中:

errors: 
    messages: 
    carrierwave_processing_error: 'Cannot resize image.' 
    carrierwave_integrity_error: 'Not an image.' 
    carrierwave_download_error: 'Couldn't download image.'