Как переназначить загруженные файлы на некоторые другие модели rails 3.1 - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть сценарий, в котором я загружаю файлы динамически, используя ajax remotipart, а затем я назначаю эти загруженные файлы любой модели. У меня есть такие настройки в загрузчике.

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

Сохраняет запись правильно, и когда получает URL-адрес файла, например @post.documents.first.document.url, он дает URL-адрес, подобный этому /uploads/documents/posts/10212/uploaded_file.doc, где файл не был доступен.

Как я могу обработать такое назначение уже существующих загрузок?

Ответы [ 2 ]

3 голосов
/ 05 октября 2012

Я пришел сюда во время поиска в Google и подумал, что некоторые люди могут помочь этому коду, который я использую в контроллере, переназначить файл (здесь это изображение) другой модели, которая обрабатывается с помощью 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

Я использую это в сочетании с ajax fileupload (хранится через TemporaryImage), гдеизображение отображается сразу и может быть обрезано .После обрезки оно сохраняется в пределах Player.

1 голос
/ 03 февраля 2012

Я решил проблему, выполнив много попаданий и следов.но окончательно решено.

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
...