【问题标题】:carrierwave throws "stack level too deep" error on file uploadcarrierwave 在文件上传时抛出“堆栈级别太深”错误
【发布时间】:2011-07-27 08:59:42
【问题描述】:

我有一个奇怪的问题,现在不知道如何进一步调试......

如果我用我的 html 表单上传文件,我会得到:

SystemStackError (stack level too deep):

轨迹是:

Started POST "/global/accounts/82" for 127.0.0.1 at 2011-07-27 10:28:03 +0200
  Processing by Global::AccountsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"tAf/cGPjW+uGgdl6J7t+IZgGsNKkVDLCCWYMFdtQd7g=", "account"=>{"logo_cache"=>"", "shortcut_icon"=>#<ActionDispatch::Http::UploadedFile:0x0000010632daa0 @original_filename="18677_265409985796_708130796_4889342_5500573_n.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"account[shortcut_icon]\"; filename=\"18677_265409985796_708130796_4889342_5500573_n.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20110727-3683-1yazc7m>>, "shortcut_icon_cache"=>""}, "commit"=>"Einstellungen speichern", "member"=>{"cancel"=>:get}, "id"=>"82"}
  User Load (1.1ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 261 LIMIT 1
  Account Load (0.8ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 82 LIMIT 1
  SQL (2.0ms)  describe `roles_users`
  Role Load (3.8ms)  SELECT `roles`.* FROM `roles` INNER JOIN `roles_users` ON `roles`.id = `roles_users`.role_id WHERE `roles`.`name` = 'admin' AND (`roles_users`.user_id = 261 ) LIMIT 1
  Account Load (1.9ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`subdomain` = '***' LIMIT 1
  SQL (0.2ms)  BEGIN
  SQL (0.6ms)  SELECT 1 FROM `accounts` WHERE (LOWER(`accounts`.`subdomain`) = LOWER('***')) AND (`accounts`.id <> 82) LIMIT 1
  AREL (0.5ms)  UPDATE `accounts` SET `shortcut_icon` = 'aadf09e05f4db4124c62bfb9340aa9bd.jpg', `updated_at` = '2011-07-27 08:28:08' WHERE `accounts`.`id` = 82
  Account Load (0.5ms)  SELECT `accounts`.* FROM `accounts` WHERE `accounts`.`id` = 82 LIMIT 1
  SQL (1.2ms)  ROLLBACK
Completed   in 2831ms

SystemStackError (stack level too deep):

分析trace,似乎文件上传并写入DB:

 AREL (0.5ms)  UPDATE `accounts` SET `shortcut_icon` = 'aadf09e05f4db4124c62bfb9340aa9bd.jpg', `updated_at` = '2011-07-27 08:28:08' WHERE `accounts`.`id` = 82

但之后它会抛出错误......

在 Rails 控制台中测试载波:

ruby-1.9.2-p180> path = "/Users/kalle/Desktop/button.png"
ruby-1.9.2-p180> u = Account.last
ruby-1.9.2-p180> u.logo = File.open(path)
 => #<File:/Users/kalle/Desktop/button.png> 
ruby-1.9.2-p180> u.save!
 => true 

工作正常!

嗯,我有一个文件上传@另一个模型,所以载波安装工作正常(类似的上传器)。

测试html表单没有文件归档,它工作正常!

所以:

  • 没有文件字段的表单可以工作
  • carrierwave 文件上传在控制台中工作
  • 不同的型号,类似的载波上传器/配置 => 有效!

如何进一步调试?

感谢您的帮助!

Rails 3.0.7/ruby-1.9.2-p180/carrierwave (0.5.3)

编辑: 似乎它只发生在更新操作上。

控制器:

def update
  if current_account.update_attributes(params[:account])
    flash[:notice] = 'Successfully updated account.'
    redirect_to global_settings_path
  else
    render :action => 'edit'
  end
end

【问题讨论】:

  • 堆栈级别太深意味着您在某处存在无限循环。您没有在更新操作中某处调用自身的方法吗?
  • 不,这是我检查的第一件事。模型/控制器非常基本。我意识到带有文件上传的更新操作在其他模型中也不起作用。所以我很确定这是一个载波“错误”。
  • 我猜 ActiveRecord 回调可能是负责任的。您可以发布您的帐户模型吗?

标签: ruby-on-rails-3 carrierwave


【解决方案1】:

我遇到了类似的问题。 当我调用 photo.url 时,它抛出了“堆栈级别深度错误”。

我的 PhotoUploader 中似乎有以下代码:

默认网址 文件名 = self.to_s content_type = File.mime_type?(文件名) 分机 = { '图像/png' => :png, '图像/jpg' => :jpg, '图像/jpeg' => :jpg, '图像/gif' => :gif }[内容类型] 分机 ||= :jpg { :id => model.id, :version => version_name, :format => ext } 结尾

此代码在carrierwave 0.5.8 中似乎运行良好。 我更新到 0.6.2,因为它失败了。

问题是我正在调用 self.to_s。正如我在载波代码中发现的那样: to_s 是这样实现的:

def to_s 网址 || '' 结尾

通过将 self.to_s 更改为 self.file 解决了问题

默认网址 文件名 = self.file # ...其余代码.. 结尾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多