2

キャリアウェーブの使用に問題がありますが、厳密には関係ありません。私はアタッチメントモデルを持っています:

class Attachment < ActiveRecord::Base
  attr_accessible :event_id, :file, :file_cache
  belongs_to :event
  mount_uploader :file, AttachmentUploader
end

イベントモデルに属する

class Event < ActiveRecord::Base

 ATTACHMENTS_LIMIT=3
 attr_accessible ...
              :attachments_attributes
 ...
 has_many :attachments, :dependent => :destroy
 accepts_nested_attributes_for :attachments
end

そしてこのようなネストされたフォーム:

<%= f.fields_for :attachments do |builder| %>
<fieldset class="attachment">
  <%= builder.file_field :file %>
  <%= builder.hidden_field :file_cache %>
  <%= link_to_remove_fields t("actions.delete"), builder %>
</fieldset>
<% end %>

検証エラーが発生した場合を除いて、問題はないようです。その後、すべてのfile_fieldが空白の値でリセットされます。しかし、私のcarrierwaveアップロードパス(* uploads / tmp / 20121003-1959-2388-3822 / Getting_Started.pdf *)を指すfile_cacheがあります。

検証エラーが発生したときにファイルが失われないようにするにはどうすればよいですか?どんなヒントでも大歓迎です!私は公式のcarrierwavewikiと関連する投稿からそれらのハウツーを吸い上げましたが、それでも運がありません。

4

1 に答える 1

1

編集:調査の結果、「image_path」フィールドとbefore_validationメソッドは必要ないことがわかりました。私がしなければならなかったのはこれだけでした:https ://github.com/jnicklas/carrierwave#making-uploads-work-across-form-redisplays 。OPのコードの問題が何であるかわかりません...それは私にはうまくいくはずです。


これと同じ問題が発生しました。carrierwaveがファイルを/tmpフォルダーに保存しておくという事実は非常に役立ちます。簡単に言うと、これが私がしたことです。

モデル:

class Image < AR:B
  mount_uploader :image, ImageUploader
  attr_writer :image_path

  before_validation :set_image

  def set_image
    self.image = File.open(@image_path) if @image_path && !image.present?
    true
  end
end

ビュー(スリムを使用):

- if f.object.image.present?
  = f.hidden_field :image_path, value: f.object.image.current_path

**注:これにより、生のhtmlで、本番サーバー上のファイルへのフルパスが公開されます。それがセキュリティ上の懸念事項である場合は、パスを暗号化/復号化するか、値を生の画像データなどに設定できます。

于 2012-12-31T02:51:25.020 に答える