2

我在使用载波时遇到了麻烦,但与它没有严格的关系。我有附件模型:

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

属于Event模型

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_fields 都将被重置为空白值。但是有一个file_cache指向我的载波上传路径(*uploads/tmp/20121003-1959-2388-3822/Getting_Started.pdf*)。

发生验证错误时如何保护文件不丢失???任何提示将不胜感激!我已经从官方的carrierwave wiki和相关帖子中汲取了这些方法,但仍然没有运气。

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

查看(使用slim):

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

** 注意:这会在原始 html 中公开生产服务器上文件的完整路径。如果这对您来说是一个安全问题,您可以加密/解密路径,或将值设置为原始图像数据或其他内容。

于 2012-12-31T02:51:25.020 回答