Ruby on rails 未定义的方法`内容长度';对于零:零级雾存储[carrierwave]
我有两个模型在carrierwave的rails项目中使用相同的上传程序Ruby on rails 未定义的方法`内容长度';对于零:零级雾存储[carrierwave],ruby-on-rails,carrierwave,Ruby On Rails,Carrierwave,我有两个模型在carrierwave的rails项目中使用相同的上传程序 class Brand < ActiveRecord::Base mount :avatar, AvatarUploader end class Profile < ActiveRecord::Base mount :avatar, AvatarUploader end 它失败,出现以下堆栈跟踪 undefined method `content_length' for nil:NilCla
class Brand < ActiveRecord::Base
mount :avatar, AvatarUploader
end
class Profile < ActiveRecord::Base
mount :avatar, AvatarUploader
end
它失败,出现以下堆栈跟踪
undefined method `content_length' for nil:NilClass
usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/storage/fog.rb:238:in `size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/uploader/proxy.rb:57:in `size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:95:in `size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:135:in `empty?'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:119:in `cache!'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327:in `cache'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179:in `avatar='
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38:in `avatar='
/usr/share/nginx/cranberrychic/releases/20140213171925/app/services/brand_into_user_converter.rb:42:in `copy_avatar'
/usr/share/nginx/cranberrychic/releases/20140213171925/app/services/brand_into_user_converter.rb:13:in `convert'
(irb):64:in `block (2 levels) in irb_binding'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in `transaction'
/usr/lib64/ruby/gems/1.9.1/gems/newrelic_rpm-3.6.0.78/lib/new_relic/agent/method_tracer.rb:486:in `block in transaction_with_trace_ActiveRecord_self_name_transaction'
/usr/lib64/ruby/gems/1.9.1/gems/newrelic_rpm-3.6.0.78/lib/new_relic/agent/method_tracer.rb:235:in `trace_execution_scoped'
/usr/lib64/ruby/gems/1.9.1/gems/newrelic_rpm-3.6.0.78/lib/new_relic/agent/method_tracer.rb:481:in `transaction_with_trace_ActiveRecord_self_name_transaction'
(irb):62:in `block in irb_binding'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/relation/delegation.rb:6:in `each'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/relation/delegation.rb:6:in `each'
(irb):59:in `irb_binding'
/usr/lib64/ruby/1.9.1/irb/workspace.rb:80:in `eval'
/usr/lib64/ruby/1.9.1/irb/workspace.rb:80:in `evaluate'
/usr/lib64/ruby/1.9.1/irb/context.rb:254:in `evaluate'
/usr/lib64/ruby/1.9.1/irb.rb:159:in `block (2 levels) in eval_input'
/usr/lib64/ruby/1.9.1/irb.rb:273:in `signal_status'
/usr/lib64/ruby/1.9.1/irb.rb:156:in `block in eval_input'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement'
/usr/lib64/ruby/1.9.1/irb.rb:155:in `eval_input'
/usr/lib64/ruby/1.9.1/irb.rb:70:in `block in start'
/usr/lib64/ruby/1.9.1/irb.rb:69:in `catch'
/usr/lib64/ruby/1.9.1/irb.rb:69:in `start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
script/rails:6:in `require'
script/rails:6:in `<main>'
nil:NilClass的未定义方法“content\u length”
usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/storage/fog.rb:238:in'size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/uploader/proxy.rb:57:in'size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:95:in'size'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/sanitized_file.rb:135:在'empty'中
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/uploader/cache.rb:119:in'cache!'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:327:in'cache'
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/mount.rb:179:in'avatar='10〕
/usr/lib64/ruby/gems/1.9.1/gems/carrierwave-0.9.0/lib/carrierwave/orm/activerecord.rb:38:in'avatar='10〕
/usr/share/nginx/cranberrychic/releases/20140213171925/app/services/brand\u-into\u-user\u-converter.rb:42:in'copy\u-avatar'
/usr/share/nginx/cranberrychic/releases/20140213171925/app/services/brand\u-into\u-user\u-converter.rb:13:in'convert'
(irb):64:在“irb_绑定中的块(2级)”中
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active\u record/connection\u adapters/abstract/database\u语句。rb:192:在“事务”中
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/transactions.rb:208:in'transaction'
/usr/lib64/ruby/gems/1.9.1/gems/newrelic\u rpm-3.6.0.78/lib/newrelic/agent/method\u tracer.rb:486:在“事务块中使用跟踪、活动记录、自身名称、事务”
/usr/lib64/ruby/gems/1.9.1/gems/newrelic_rpm-3.6.0.78/lib/newrelic/agent/method_tracer.rb:235:在“跟踪执行”范围内
/usr/lib64/ruby/gems/1.9.1/gems/newrelic\u rpm-3.6.0.78/lib/newrelic/agent/method\u tracer.rb:481:in“带有跟踪的事务”\u ActiveRecord\u self\u name\u transaction”
(irb):62:在“irb_绑定中的块”
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_-record/relation/delegation.rb:6:in'each'
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/active_-record/relation/delegation.rb:6:in'each'
(irb):59:in'irb_binding'
/usr/lib64/ruby/1.9.1/irb/workspace.rb:80:in'eval'
/usr/lib64/ruby/1.9.1/irb/workspace.rb:80:in'evaluate'
/usr/lib64/ruby/1.9.1/irb/context.rb:254:in“evaluate”中
/usr/lib64/ruby/1.9.1/irb.rb:159:in`eval_输入中的块(2级)'
/usr/lib64/ruby/1.9.1/irb.rb:273:处于“信号状态”
/usr/lib64/ruby/1.9.1/irb.rb:156:in“评估输入中的块”
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:243:in`block(2个levels)中的每个顶级\u语句'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:229:in'loop'
/usr/lib64/ruby/1.9.1/irb/ruby lex.rb:229:in`block in each_top_level_语句'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:228:in'catch'
/usr/lib64/ruby/1.9.1/irb/ruby-lex.rb:228:“每个顶级语句”
/usr/lib64/ruby/1.9.1/irb.rb:155:in'eval_input'
/usr/lib64/ruby/1.9.1/irb.rb:70:in'block in start'
/usr/lib64/ruby/1.9.1/irb.rb:69:in'catch'
/usr/lib64/ruby/1.9.1/irb.rb:69:in'start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in'start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in'start'
/usr/lib64/ruby/gems/1.9.1/gems/railties-3.2.13/lib/rails/commands.rb:41:in`'
脚本/rails:6:in'require'
脚本/rails:6:in`'
对我来说,carrierwave和fog存储是一个bug,因为在文件存储的开发过程中,一切都按预期工作。当我尝试使用carrierwave以任何可能的方式将图像从一个模型复制到另一个模型时,它会失败,并出现相同的错误
我的carrierwave版本是0.9.0
rails版本是3.2.13和ruby 1.9.3-p327,我相信你做得不对
profile.avatar = brand.avatar
将不起作用,因为profile.avatar=
需要一个文件对象和品牌。avatar
不给你文件对象(它会返回一个上传者,即avatar对象)
我相信你正在寻找这种方法
profile.remote_avatar_url = brand.avatar.url
profile.save!
考虑到brand.avatar.url
给你一个carrierwave可以下载文件的url
有关remote{uploader}\uURL
的更多信息也可以在Carrierwave中找到
希望这有帮助
profile.remote_avatar_url = brand.avatar.url
profile.save!