2

しばらくの間、ファイルのアップロードに Carrierwave を使用しています。ファイルがアップロードされたときにファイルの名前を変更しようとしませんでした。ここで、各ファイルにランダムな名前と、コンテンツ タイプと一致するファイル拡張子を付けたいと思います。wiki や他のサイトを読んだところ、アップローダーで次のことができるように推奨されました。

def filename
  "#{secure_token}.#{file.extension}" if original_filename.present?
end

private
def secure_token
  #implement the secure token
end

アップローダへのこれらの追加後にアップロードされたファイルでは正常に機能しました。しかし、この変更の前にアップロードされた多くのファイルを取得しました。誰かが古いファイルを移行する方法を教えてくれるかどうか疑問に思っていました.

アップローダーにメソッドを追加してみました:

def rename_file!
  model.update_attribute mounted_as, "#{secure_token}.#{file.extension}"
  recreate_versions!
end

次に、レールコンソールで、アタッチメント付きのモデルでこれを呼び出してみました。ただし、モデルの列が更新されていないことがわかりましたがmounted_as、ファイル システムでは、さまざまなバージョンのファイルが新しい名前で作成されていました。モデルのフィールドを調べたところ、mounted_as更新されていませんでした。ログは実際には、列が古い値で更新されたと述べています。

mounted_asモデルの列を更新するにはどうすればよいですか?

さらに、古い名前の古いファイルがまだファイル システムに残っているように見えました。それらを削除する方法はありますか?私は行を追加しようとしました:

file.move_to File.join("#{File.dirname file.path}, "#{secure_token}.#{file.extension}")

rename_file!メソッドで。mounted_asファイルの名前が変更されましたが、モデルの列は更新されませんでした。そのため、その URL にアクセスすると 404 が発生しました。

4

1 に答える 1

4

これは少し古いことを知っていますが、おそらく他の人にとっては役立つでしょう。

アップローダーをfilenameメソッドで更新した後、Rails コンソールからこれを実行できます。

Post.all.each do |p|
  p.avatar.recreate_versions!
  p.save!
end

CarrierWave の現在のバージョンでは、これによりファイルの名前が変更され、モデル レコードが更新されます。

Postはもちろん機種名とavatarアップローダを搭載しているカラムですので、必要に応じて変更してください。

于 2014-04-01T18:35:22.293 に答える