Carrierwave with RMagick 的 StackLevel too deep 靈異現象

早上在 maintain 一個小專案的時候發現之前 ok 的 rake task 竟然動不了
一行行偵錯才發現是死在這裡

photo = Photo.new
photo.remote_file_url = "PHOTO_URL"

而錯誤訊息則是可惡的 SystemStackError: stack level too deep ( which is 有說跟沒說一樣)
不過既然是掛在 photo.remote_file_url 這邊,那勢必和 PhotoUploader 有關

於是進了 rails console 直接 new 一個 photo 物件看看
想不到出現一堆警告訊息

RMagick.rb:44: warning: already initialized constant XXXXXX
(下略一百行

okay, 這下知道兇手可能是 RMagick
用 Rmagick warning 問狗, 馬上得知因為 Gemfile 裡如果是這樣寫的話, RMagick 的 constant 會自動 initialize 一次

gem 'rmagick'

而在 PhotoUploader 裡因為我們需要對圖檔進行操作, 所以也加上了這段

include CarrierWave::RMagick

卻導致 RMagick 又再次 initalized
解法其實很簡單, 只要將 Gemfile 改成這樣即可

gem 'rmagick', require: false

如此一來 RMagick 就只會在 PhotoUploader 被叫起的時候才 init
靈異現象結案.

Comments

comments powered by Disqus