2012-10-05 28 views
2

我想配置Carrier Wave Direct的上傳路徑,我正在使用它將文件直接上傳到Amazon S3。在app/uploaders/myuploader.rb中,我有,基於載波直接記錄值的上傳路徑

def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
end 

我想修改此,這樣的路徑看起來像,
「上傳/#{} model.class.to_s.underscore /#{} mounted_as /#{User.name}中」。
所以它會有點像
「uploads/Users/avatar/michael_jordan/..」
其中User是安裝上傳器的模型。

我已經通過github中的Carrier wave Gem源代碼(https://github.com/dwilkie/carrierwave_direct),我無法弄清楚如何將活動模型對象的值傳遞給上傳器以創建上傳路徑(key for amazon s3 )。有沒有辦法做到這一點?

謝謝!

+0

也許我誤解你的問題,但爲什麼不' 「上傳/#{} model.class.to_s.underscore /#{} mounted_as /#{} model.name」'做你想做的事? – cdesrosiers

+0

模型。名稱將給出我猜的實際型號名稱..而不是當前記錄的值。 – quixote

回答

5

好吧,一個月後,我被迫在同一個問題上工作,這一次我釘了它。在這裏給我的解決方案,以便它可以Ÿ幫助有同樣的問題別人, 1)覆蓋store_dir使得它返回一個空字符串,

def store_dir 
"" 
end 

2)得到了你的控制器,並指定您的首選關鍵看你上傳對象的像「鍵」屬性,

@uploader = @player.avatar 
    @uploader.key [email protected] +"/\${filename}" 
    #say if player name in is jordan and the filename is jordan.jpg. 
    #the uplaod path now will be 
    #http://bucketname/jordan/jordan.jpg. 

這裏的球員是模型對象,頭像是在其上傳安裝和密鑰將被設置爲playername /文件名的屬性。

這就是我一直在尋找:)

+0

輝煌!我一直在尋找如何使用carrierwave直接控制我的文件名。感謝您發佈此信息。 – Homan

+0

如果要將隨機數字序列保留爲密鑰的一部分,會發生什麼情況? – Homan

+0

爲什麼我得到未定義的方法'key ='for# medBo

2

如果model.name不起作用,你可以嘗試直接與#read_attribute方法訪問name字段

所以你store_dir方法將看起來像

def store_dir 
    uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.send(:name)} 
end 

但是我相信model.name應工作

0

第一個提供解決方案,我沒有工作。此故障排除一整天后,我檢查了動態創建的關鍵代碼:

https://github.com/dwilkie/carrierwave_direct/blob/master/lib/carrierwave_direct/uploader.rb

# as defined in carrierwave_direct/uploader.rb 
def key 
    return @key if @key.present? 
    if present? 
    self.key = URI.parse(URI.encode(url, " []+()")).path[1 .. -1] # explicitly set key 
    else 
    @key = "#{store_dir}/#{guid}/#{FILENAME_WILDCARD}" 
    end 
    @key 
end 

嘖。而不是試圖重寫此方法,我只是推翻了store_dir和GUID方法直接上傳:

def store_dir 
    "#{model.group.id}/photos" 
end 

def guid 
    Time.now.utc.strftime("%Y-%m-%d-%H%M%S") 
end 

希望這可以幫助別人。

-4

https://github.com/gilcierweb/CMS-Rails

# app/uploads/galeria_imagem_uploader.rb 
class GaleriaImagemUploader < CarrierWave::Uploader::Base 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}#{model.galeria_id}" 
    end 
end 

# app/models/adm/galeria_imagem.rb  
class Adm::GaleriasImagem < ActiveRecord::Base 
    belongs_to :galeria, :polymorphic => true 
    validates :galeria, presence: true 
    # GaleriasImagem uploader using carrierwave 
    mount_uploader :imagem, GaleriaImagemUploader 
end 

# app/models/adm/galeria.rb 
class Adm::Galeria < ActiveRecord::Base 
    has_many :galerias_imagens, :inverse_of => :galeria, :dependent => :destroy 
    # enable nested attributes for galerias_imagens through galeria class 
    accepts_nested_attributes_for :galerias_imagens, allow_destroy: true 
end 

# app/controllers/adm/galerias_controller.rb 
class Adm::GaleriasController < ApplicationController 
    def create 
    @adm_galeria = Adm::Galeria.new(adm_galeria_params) 
    respond_to do |format| 
     if @adm_galeria.save  
     # to handle multiple images upload on create 
     if params[:adm_galeria][:imagem] 
     params[:adm_galeria][:imagem].each { |image| 
      @adm_galeria.galerias_imagens.create(imagem: image)} 
     end 
     format.html { redirect_to @adm_galeria, notice: 'Galeria was successfully created.' } 
     format.json { render :show, status: :created, location: @adm_galeria } 
     else 
     format.html { render :new } 
     format.json { render json: @adm_galeria.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

# app/controllers/adm/galerias_imagens_controller.rb 
class Adm::GaleriasImagensController < ApplicationController 
    def create 
    @adm_galerias_imagem = Adm::GaleriasImagem.new(adm_galerias_imagem_params) 
    @adm_galerias_imagem.save 
    end 
end 
+4

首先,請在您的帖子中使用英文。其次,文本僅在代碼註釋中,所以如果它以某種方式連接到問題本身(我不確定),它的質量似乎很低。 – Alexey