1

刚开始在 Rails 中使用carrierwave,事情进展顺利,只有一个小例外。我创建了一个看起来像这样的“ImageUploader”类:

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 似乎通过了,我通常被重定向到 user_path(@user) 并带有 flash[:success] 消息。图像本身实际上并没有改变,但我希望能够捕获错误并在扩展类型不正确的情况下重定向到“编辑”页面。关于我在这里做错了什么的任何想法?

4

2 回答 2

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
于 2011-03-03T14:57:27.107 回答
0

仅供参考,CarrierWave 文档说明如下:

Active Record 验证使用 Rails i18n 框架。将这些键添加到您的翻译文件中:

errors:
  messages:
    carrierwave_processing_error: 'Cannot resize image.'
    carrierwave_integrity_error: 'Not an image.'
    carrierwave_download_error: 'Couldn't download image.'
于 2012-07-09T05:39:31.093 回答