1

レガシー移行の一環として Rails アプリに移行する必要がある既存のファイルのディレクトリがあります。基本的に、これらのファイルを手動でアップロードし、それらの新しいレコードをデータベースに保存する必要があります。これを行う適切な方法がまったく見つかりませんでした。現在、レーキタスクには次のものがあります。

@attachments.each do |attachment|
  begin
    new_attachment = Attachment.new

    @attachment_file_path = "/home/username/Attachments/" + attachment.Filename
    file = File.open(@attachment_file_path)
    new_attachment[:file] = new_attachment.file.store!(file)

    # Map old record fields to new
    new_attachment.attributes = {
        :project_id => attachment.ProjectID,
        :name => attachment.Description,
        :user_id => attachment.UserId,
        :created_at => attachment.CreatedDate,
        :updated_at => attachment.LastModifiedDate
    }

    new_attachment.save!

    puts "Attachment added successfully "

  rescue => error
    puts "Error migrating Attachment: #{error}"
  end
end

添付.rb

class Attachment < ActiveRecord::Base
     mount_uploader :file, FileUploader
end

アップローダ:

class FileUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick
  include CarrierWave::MimeTypes

  process :set_content_type
  storage :fog

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

  def extension_white_list
    %w(jpg jpeg gif png pdf doc docx txt)
  end

  version :thumb do
    process resize_to_fit: [152, nil]
  end

  def default_url
      ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  end

  protected
    def image?(new_file)
      if new_file.content_type == nil
        return false
      else
        new_file.content_type.include? 'image'
      end
    end


end

これは現在機能しません。ファイルがアップロードされず、時々次のエラーが発生します。

Failed to manipulate with rmagick, maybe it is not an image? Original Error: no decode delegate for this image format

この場合、ファイルは「.doc」ファイルです。

ローカル ファイルを開いて Carrierwave 経由で手動でアップロードする正しい方法は何ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

これを試して

@attachments.each do |attachment|
  begin
    options =  {
        :project_id => attachment.ProjectID,
        :name => attachment.Description,
        :user_id => attachment.UserId,
        :created_at => attachment.CreatedDate,
        :updated_at => attachment.LastModifiedDate,
        :file => File.new(File.join("/home/username/Attachments/",attachment.Filename)) 
    }

     new_attachment = Attachment.new(options)
   

    new_attachment.save!

    puts "Attachment added successfully "

  rescue => error
    puts "Error migrating Attachment: #{error}"
  end
end

store!キャリアウェーブが内部的にあなたを呼び出すので、おそらくそれはあなたのために行うでしょう

質問?

Failed to manipulate with rmagick, maybe it is not an image? Original Error: no decode delegate for this image format

image?条件で指定されていないメソッドを定義しているため、ここで何をしようとしているのかcontent_typeわからimageない

noおそらくプロセス呼び出しだけが機能する場合

process :set_content_type

もしそうならyes、おそらくあなたはこのようなことをしなければなりません

process :set_content_type , :if => :image?

def image?(new_file)
  %w(jpg jpeg gif).include?(new_file.extension)
end

この助けを願っています

コメントに基づいて編集

これを試して、条件と同じロジックを使用しました

   version :thumb ,:if => image? do
     // your code 
   end   
 

 
于 2013-08-01T13:30:06.670 に答える