载波抛出“堆栈电平太深”。文件上传错误 [英] carrierwave throws "stack level too deep" error on file upload
问题描述
我遇到了一个奇怪的问题,现在不知道如何进一步调试...
i have a weired problem and don't now how to debug further...
如果我使用html格式上传文件,则会得到:
if i upload an file with my html form i get:
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):
跟踪,似乎文件已上传并写入数据库:
analysing the trace, it seems that the file is uploaded and written to the DB:
AREL (0.5ms) UPDATE `accounts` SET `shortcut_icon` = 'aadf09e05f4db4124c62bfb9340aa9bd.jpg', `updated_at` = '2011-07-27 08:28:08' WHERE `accounts`.`id` = 82
,但是之后会引发错误...。
but after that it throws the error....
在rails控制台中测试载波:
testing carrierwave in the rails console:
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
可以正常工作!
我有一个文件上传@另一个模型,因此载波安装工作正常(类似上传器)。
well, i have a file upload @ another model, so the carrierwave installation works fine (similar uploader).
测试html表单不提交文件
所以:
- 表格在没有文件字段的情况下工作
- 载波文件上传可在控制台中运行
- 不同的模型,类似的carrierwave uploader / config =>可以运行!
我该如何进一步调试?
感谢您的帮助!
Rails 3.0.7 / ruby-1.9.2-p180 / carrierwave(0.5.3)
Rails 3.0.7/ruby-1.9.2-p180/carrierwave (0.5.3)
编辑:
似乎只发生在更新操作上。
seems that it happens only on the update action.
控制器:
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
推荐答案
<我有类似的问题。
当我调用photo.url时,它引发了堆栈级深度错误。
I had a similar problem. When I called photo.url it throwed a "stack level to deep error".
在我的PhotoUploader中似乎有以下代码:
It seemed I had the following code in my PhotoUploader:
def url
filename = self.to_s
content_type = File.mime_type?(filename)
ext = {
'image/png' => :png,
'image/jpg' => :jpg,
'image/jpeg' => :jpg,
'image/gif' => :gif
}[content_type]
ext ||= :jpg
{ :id => model.id, :version => version_name, :format => ext }
end
此代码在0.5.8载波中似乎可以正常工作。
我更新到0.6.2,因为它失败了。
This code seemed to work fine in carrierwave 0.5.8. I updated to 0.6.2 and since it failed.
问题是我打电话给self.to_s。正如我在载波代码中发现的那样:
to_s是这样实现的:
The problem is I'm calling self.to_s. As I found out in the carrierwave code: to_s is implemented like this:
def to_s
url || ''
end
通过将self.to_s更改为self.file问题已解决
By changing self.to_s to self.file the problem was solved
def url
filename = self.file
# ... rest of the code ..
end
这篇关于载波抛出“堆栈电平太深”。文件上传错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!