0

アップローダーをマウントしてモデルを保存すると、保存するたびにバージョンが削除されます(画像を通常どおりアップロードしても、バージョンが作成されていないように見えます)。数日/数週間前までは正常に機能していたことに注意してください(Rails 3.2.11に移動したことで発生した可能性がありますが、正確な時刻はわかりませんでした。以前は3.2.8でした)。

私のモデルは次のように定義されています。

class Profile < ActiveRecord::Base
  attr_accessible :profile_picture
  mount_uploader :profile_picture, ProfilePictureUploader
  ...
end

そして私のProfilePictureUploader

class ProfilePictureUploader < BaseUploader
  process :resize_to_fill => [248, 248]

  version :tiny do
    process :resize_to_fill => [34, 34]
    def full_filename(for_file = model.photo.file)
      "#{model.to_s.parameterize}_tiny.jpg"
    end
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  def filename
    # John Snow -> john-snow-20120913162935.jpg
    # ACME inc. -> acme-inc-20120913162935.png
    "#{model.to_s.parameterize}-#{Time.now.strftime("%Y%m%d%H%M%S")}#{File.extname(original_filename)}" if original_filename
  end
end

そして最後に私のBaseUploader

class BaseUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  # Override the directory where uploaded files will be stored.
  def store_dir
    "system/uploads/#{model.class.to_s.underscore}/#{model.id}"
  end

  # Override the filename of the uploaded files:
  def filename
    "#{mounted_as}#{File.extname(original_filename)}" if original_filename
  end
end

開発ではファイルストアを使用し、本番環境ではフォグストレージを使用していますが、両方の環境で問題が発生するため、ファイルストレージを使用していると仮定します。

これが私の典型的なシナリオです:

  • プロファイルに画像をアップロードすると、標準の画像のみが作成されます(例:) mbillard-20130122102833.jpg
  • 私はプロフィール写真を呼び出しますrecreate_versions!。標準画像と小さなバージョンの両方が作成されます(私の特定の命名スキームのために標準が再作成されます、私はそれで大丈夫です)。
  • モデルを保存すると、属性system/uploads/profile/1/のファイル名を持つ画像を除いて、フォルダー()内のすべてが削除されます。profile_picture

私はcarrierwave0.8.0を使用します。保存トリガーと関係があると思いますが、コードを見てもわかりませんでした。

( GitHubの問題も並行して開いています)

4

1 に答える 1

0

私はついにそれを理解しました。基本的に、以前のバージョンと同じ名前だったので、新しく作成したバージョンを削除remove_previously_stored_#{column}したようです。mount.rb

タイムスタンプを含めるように小さなバージョンのファイル名を変更しました(以前の小さなバージョンと同じファイル名にならないように):

version :tiny do
  process :resize_to_fill => [34, 34]
  def full_filename(for_file = model.photo.file)
    "#{model.to_s.parameterize}_#{timestamp}_tiny.jpg"
  end
end

ロジックを単純化filenameして、タイムスタンプを使用してファイル名を単純に定義しました。

# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
def filename
  # John Snow -> john-snow-20120913162935.jpg
  # ACME inc. -> acme-inc-20120913162935.png

  "#{model.to_s.parameterize}-#{timestamp}#{File.extname(original_filename)}" if original_filename.present?
end

そして、私のタイムスタンプ関数は、ファイル名からタイムスタンプを抽出するか、バージョンを再作成するとき、または新しいファイルをアップロードするときに(original_filenameが存在する場合)新しいタイムスタンプを生成します。

protected

def timestamp
  if original_filename.blank?
    match_data = /^.+-(\d{14})\.\D{3,4}$/.match(File.basename(model.read_attribute(mounted_as)))

    return match_data[1] if match_data
  end

  var = :"@#{mounted_as}_timestamp"
  model.instance_variable_get(var) || model.instance_variable_set(var, Time.now.strftime("%Y%m%d%H%M%S"))
end

以前のタイムスタンプは私のモデルの属性に保存できますが、これは私にとってはうまくいくことに注意してください。

今私を悩ませているのは、バージョンを再作成するときに以前のファイルを削除するためにモデルを保存する必要があることだけです。

model.recreate_versions! # recreates versions but leaves the previous files there
model.save # removes the previous files

私の思考プロセス全体は、GitHubの問題で確認できます。

于 2013-01-23T18:51:47.567 に答える