Rails Carrierwave White_List не выбрасывает исключения - PullRequest
1 голос
/ 01 марта 2011

Только что начал использовать carrierwave с Rails, и все шло гладко с одним небольшим исключением. Я создал класс 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]. Само изображение фактически не изменяется, но я хотел бы иметь возможность отловить ошибку и перенаправить на страницу «edit» в случае неправильного типа расширения. Любые идеи о том, что я делаю здесь не так?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Для всех, кто заинтересовался, я нашел способ обойти это сам. Не самое элегантное решение, но в любом случае вот что сработало для меня:

@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 голосов
/ 09 июля 2012

К вашему сведению, документация 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.'
...