2012-02-01 1 views
2

나는 Ajax remotipart을 사용하여 파일을 동적으로 업로드하는 시나리오를 가지고 있습니다. 그런 다음 나중에 업로드 된 파일을 모든 모델에 할당합니다. 나는 업 로더에서 그런 설정을했다. 업로드 된 파일을 다른 모델의 레일에 다시 할당하는 방법 3.1

class DocumentUploader < CarrierWave::Uploader::Base 
    storage :file 
    def store_dir 
    "uploads/#{model.class.to_s.pluralize.underscore}/#{model.documentable_type.to_s.pluralize.underscore}/#{model.documentable_id}" 
    end 

    def extension_white_list 
    %w(doc pdf docx xls xlsx) 
    end 
end 

class Document < ActiveRecord::Base 
    mount_uploader :document, DocumentUploader 
    belongs_to :documentable, :polymorphic => true 

    validates :document, :presence => true 
    validates :description, :presence => true 
end 

class Post < ActiveRecord::Base 
    has_many :documents, :as=>:documentable 
end 

내가 documentable 소스를 제공하지 않고 문서를 업로드

, 그것은 /uploads/documents/uploaded_file.doc

에 파일을 업로드하지만

@post = Post.first 
@post.documents << Document.last 
@post.save 

처럼 다른 모델에 해당 문서를 할당 할 때 제대로 레코드를 저장 @post.documents.first.document.url과 같은 파일의 URL을 얻으면이 파일을 사용할 수없는 /uploads/documents/posts/10212/uploaded_file.doc과 같은 URL을 제공합니다.

기존 업로드를 어떻게 할당 할 수 있습니까?

답변

1

많은 히트와 트레일로 문제를 해결했습니다. 그러나 마침내 해결되었다.

class Document < ActiveRecord::Base 
    mount_uploader :document, DocumentUploader 
    belongs_to :documentable, :polymorphic => true 

    validates :document, :presence => true 
    validates :description, :presence => true 

    after_update :relocate_files 

    def relocate_files 
    src_file = Rails.root.join("public", "uploads", "documents", document.url.split("/").last) 
    dst_file = Rails.root.join("public", "uploads", "documents", documentable_type.pluralize.underscore, documentable_id.to_s, document.url.split("/").last) 
    unless FileTest.exists?(dst_file) 
     FileUtils.mkdir_p(File.dirname(dst_file)) 
     FileUtils.mv(src_file, dst_file) 
    end 
    end 
end 
3

나는 인터넷 검색을하는 동안 여기에 와서 어떤 사람들은 내가 CarrierWave로 처리됩니다 다른 모델에 (여기가 이미지의) 파일을 다시 할당 할 컨트롤러에 사용하고이 코드 조각을 도움이 될 생각 :

def create 
    temporary_image = TemporaryImage.find(params[:temporary_image][:id]) 
    @player = Player.new(params[:player]) 
    @player.image = File.open(temporary_image.image.current_path) 
    # now you can handle @player.image as if it was 
    # originally assigned by CarrierWave 
end 

여기서

class Player < ActiveRecord::Base 
    attr_accessible :image 
    mount_uploader :image, PlayerImageUploader 
end 

class TemporaryImage < ActiveRecord::Base 
    attr_accessible :image 
    mount_uploader :image, TemporaryImageUploader 
end 

이미지를 즉시 표시하는 (저장된 TemporaryImage을 통해 저장 됨)과 함께 사용하는 경우 cropped이 될 수 있습니다. 자르기 후에는 Player 내에 저장됩니다.

관련 문제