2016-04-06 6 views
1

私は自分のアプリケーションのファイルアップロードを処理するためにPaperclipを使用しています。私はファイルのcontent-typeに基づいてファイルのパスを変更できるようにする必要があります。ラムダでこれを行うと、私はstack level too deepエラーを受け取ります。Paperclipを使用してコンテンツタイプに基づいてアップロードされたファイルのパスを変更します。

has_attached_file :file, :storage => :s3, 
          path: lambda { |a| a.instance.determine_path_for_content }, 
          :s3_credentials => { 
          :bucket => 'myBucket', 
          :access_key_id => ENV['AWS_ACCESS_KEY'], 
          :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
          } 

def determine_path_for_content 
    if file.instance.file_content_type == "video/mp4" 
     "/:name/:event:event_id/:basename_time_:start_mp4_at_end_time:fingerprint.:extension" 
    else 
     "/:name/:event:event_id/:basename_:fingerprint.:extension" 
    end 
end 

答えて

2

この方法を試してください。

has_attached_file :file, :storage => :s3, 
          path: lambda { |a| a.class.determine_path_for_content(file.instance.file_content_type) }, 
          :s3_credentials => { 
          :bucket => 'myBucket', 
          :access_key_id => ENV['AWS_ACCESS_KEY'], 
          :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
          } 

def self.determine_path_for_content(content_type) 
    if content_type == "video/mp4" 
     "/:name/:event:event_id/:basename_time_:start_mp4_at_end_time:fingerprint.:extension" 
    else 
     "/:name/:event:event_id/:basename_:fingerprint.:extension" 
    end 
end 

クラスメソッドとしてこれを持って、私の見解では、優れている、それはあなたがここに持って再帰を避ける必要があります。

関連する問題