2015-01-15 71 views
0

我無法弄清楚爲什麼這不起作用。我需要調試幫助,我是Ruby on Rails的新手。調試幫助:Ruby on Rails S3和Carrierwave文件保存失敗

我想存儲一個簡單的s3文件到我的亞馬遜桶。而已。我不需要將此文件附加到控制器中的任何行,也不需要像所有示例所示那樣存儲在數據庫中。我只是需要它把它放在桶裏。我想我可能需要覆蓋頭像上傳器中的store_dir,但我不知道如何。

下面是我

的觀點:

= form_tag import_orders_path, :class => 'order-uploads', :multipart => true do 
    = file_field_tag 'upload[file]' 
    /:file for just getting param[:file] from server 
    %br 
    = submit_tag "Import CSV", :class => 'submit-file' 

控制器:

uploader = AvatarUploader.new 
puts YAML::dump(params[:upload][:file].path) 
uploader.store!(params[:upload][:file]) 

文件路徑名:

/tmp/RackMultipart20150115-9225-o2c5hp 

avatar.rb上傳

# encoding: utf-8 

class AvatarUploader < CarrierWave::Uploader::Base 

    # Choose what kind of storage to use for this uploader: 
    storage :fog 


    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

end 

carrierwave.rb初始化

require 'fog' 
require 'carrierwave' 

CarrierWave.configure do |config| 
    config.fog_credentials = { 
    :provider    => 'AWS',      # required 
    :aws_access_key_id  => 'my_key_id',      # required 
    :aws_secret_access_key => 'my_secret_key',      # required 
    :region     => 'us-east-1',     # optional, defaults to 'us-east-1' 
    } 
    config.fog_directory = "my_bucket" 
end 

錯誤:

NoMethodError (undefined method `id' for nil:NilClass): 
    app/uploaders/avatar_uploader.rb:16:in `store_dir' 
    app/controllers/orders_controller.rb:18:in `import' 



NoMethodError (undefined method `id' for nil:NilClass): 
    app/uploaders/avatar_uploader.rb:16:in `store_dir' 
    app/controllers/orders_controller.rb:18:in `import' 
+0

你'store_dir'引用了一個模型,它的ID,解決這個問題,這應該消失 –

回答

1

你上傳的文件應該是

應該app/uploaders/avatar_uploader.rb

class AvatarUploader < CarrierWave::Uploader::Base 

# Choose what kind of storage to use for this uploader: 
storage :fog 

end 

然後

uploader = AvatarUploader.new 
uploader.store!(my_file) 
uploader.retrieve_from_store!('my_file.png')