使用CarrierWave和RMagick处理时出现错误

4

我正在使用Rails 4,试图上传一张图片并在处理后存储它。

我只使用一个视图,在视图中用户可以上传图片,我会处理这张图片,将其存储在数据库中,然后重新加载页面以显示新处理过的图片。

我的模型(user.rb)

class User < ActiveRecord::Base
    mount_uploader :image, ImageUploader
end

上传器 (image_uploader.rb)

# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base

include CarrierWave::RMagick
storage :file

def store_dir
 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

process :changeImage

def changeImage
 manipulate! do |source|
   source = source.sepiatone
 end
end

控制器(app_main_controller.rb)

require 'Rmagick'

class AppMainController < ApplicationController
def index
        # page reload handling when the file uploads
        if(params.has_key?("file-input")) 
            @u= User.new
            @u.image = params["file-input"]
            if(@u.save)
                render js: "alert('SAVED')"
            else
                render js: "alert('Error while saving image! Try Again!')"
            end
         # initial page load
        else
        end
    end
end

我在视图(即index)中使用image_tag @u.image_url访问图片上传组件。

每次在image_uploader.rb中添加任何类型的处理操作时,我都会收到“堆栈过深”的错误提示。如果不添加处理操作,则图片可以成功上传。

有什么想法吗?请指教。


"stack level too deep" 通常意味着您在没有任何结束递归条件的情况下递归调用函数。因此,从您的代码来看,我猜测 source = source.sepiatone 在某种程度上再次触发了 process 方法,从而导致无限递归。 - Zeeshan
.sepiatone是RMagick宝石中的一种方法,所以我想可能存在一些问题。 - utsavanand
1个回答

1
我遇到了同样的问题,看起来是rmagick gem的问题。
编辑: 问题出在大小写上。请尝试使用以下代码:
gem 'rmagick', :require => 'RMagick'

另请参阅这个stackoverflow答案这个问题或者github上的这个问题

我改用了mini_magick来解决它。(不是最理想的,但现在对我起作用了。)

上传器类(注释掉RMagick):

include CarrierWave::MiniMagick

Gemfile:

gem 'mini_magick'

实际上,我也尝试过使用MiniMagick。调整大小效果很好。但是当我使用.sepiatone和其他方法时,它开始给我“NoMethodErrors”。 - utsavanand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接