【问题标题】:Carrierwave/RMagick NoMethodError after upgrade to ruby 2.0升级到 ruby​​ 2.0 后的 Carrierwave/RMagick NoMethodError
【发布时间】:2013-07-12 07:29:57
【问题描述】:

我将我的应用程序从 ruby​​ 1.9.3 升级到 ruby​​ 2.0,让我的大部分 gem 没有升级。 一切正常,但是当我尝试上传图片时,出现此错误:

NoMethodError - undefined method `[]=' for nil:NilClass:
  app/uploaders/image_uploader.rb:91:in `block in optimize'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/processing/rmagick.rb:263:in `manipulate!'
  app/uploaders/image_uploader.rb:90:in `optimize'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/processing.rb:85:in `block in process!'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/processing.rb:81:in `each'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/processing.rb:81:in `process!'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/callbacks.rb:18:in `block in with_callbacks'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/callbacks.rb:18:in `each'
  /home/stefpe/.rvm/gems/ruby-2.0.0-p195@Lefkada/bundler/gems/carrierwave-5ee108128b40/lib/carrierwave/uploader/callbacks.rb:18:in `with_callbacks'

image_uploader.rb 基于 /carrierwave/processing/rmagick.rb 示例manipulate 函数:

  def optimize
    manipulate! do |img, index, options|
      options[:write] = {
    :quality => 50,
    :depth => 8,
    :interlace => "Magick::PlaneInterlace"
      }
      img.strip!
    end
  end

配置: 服务器:heroku,本地开发:linux

红宝石 1.9.3 -> 2.0

导轨 3.2.13

载波0.6.2

rmagick 2.13.1

雾 1.3.1

知道为什么不兼容 ruby​​-2.0.0 吗?

提前谢谢你!

【问题讨论】:

  • 你会这么好,并像错误消息所说的那样在第 91 行包含摘录吗?

标签: ruby-on-rails ruby carrierwave rmagick ruby-2.0


【解决方案1】:

我做到了: sudo apt-get install libmagickwand-dev

然后 宝石安装 rmagick

成功了。 看: rmagick gem install "Can't find Magick-config"

【讨论】:

    【解决方案2】:

    您应该尝试更新一些 gem——carrierwave 可能在 2012 年 4 月还没有与 ruby​​ 2 完全兼容。

    进一步的激励:Carrierwave didn't 甚至将选项传递到传递给manipulate! 的块中,直到0.7

    【讨论】:

      【解决方案3】:

      对我有用的是在操作结束时返回图像! 在你的情况下:

      def optimize
        manipulate! do |img, index, options|
          options[:write] = {
            :quality => 50,
            :depth => 8,
            :interlace => "Magick::PlaneInterlace"
          }
          img.strip!
          img
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-17
        • 2023-03-27
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多