由于验证错误而无法保存模型时,不会丢失回形针附件

pea*_*ter 25 validation ruby-on-rails attachment paperclip

该场景是一个普通模型,其中包含回形针附件以及具有各种验证的其他一些列.当由于与附件无关的验证错误而无法保存要创建对象的表单时,会保留字符串等列并为用户保留预填充,但选择用于上载的文件完全丢失且必须由用户重新选择.

在模型验证错误的情况下,是否有标准方法来保留附件?这似乎是一个非常常见的用例.

在没有所有者的情况下保存文件然后在成功保存之后重新连接到对象的解决方案似乎是不优雅的,所以我希望避免这种情况.

Joh*_*ibb 12

切换到使用CarrierWave.我知道这是在评论中,但我只是整天都在进行过渡,所以我的回答可能仍然有用.

首先,您可以按照关于设置载波的优秀轨道广播:http://railscasts.com/episodes/253-carrierwave-file-uploads

要使其在帖子之间保留图像,您需要添加带有后缀"cache"的隐藏字段:

<%= form_for @user, :html => {:multipart => true} do |f| %>
  <p>
    <label>My Avatar</label>
    <%= f.file_field :avatar %>
    <%= f.hidden_field :avatar_cache %>
  </p>
<% end %>
Run Code Online (Sandbox Code Playgroud)

对于Heroku

如果您像我一样部署到Heroku,则需要进行一些更改才能使其正常工作,因为缓存的工作方式是将上传暂时保存在名为public/uploads的目录中.由于文件系统只是在Heroku中,所以你需要让它使用tmp文件夹,并让机架从那里提供静态文件.

告诉carrierwave使用tmp文件夹进行缓存.

在你的config/initializers/carrierwave.rb中(如果不存在则随意创建),添加:

CarrierWave.configure do |config|
  config.root = Rails.root.join('tmp')
  config.cache_dir = 'carrierwave'
end
Run Code Online (Sandbox Code Playgroud)

配置机架以从tmp/carrierwave文件夹中提供静态文件

在您的config.ru文件中,添加:

use Rack::Static, :urls => ['/carrierwave'], :root => 'tmp'
Run Code Online (Sandbox Code Playgroud)

有关全功能准系统rails/carrierwave/s3/heroku应用程序的示例,请查看:

https://github.com/trevorturk/carrierwave-heroku(没有隶属关系,只是有用).

希望这可以帮助!


jon*_*nii 0

如果不需要图像,为什么不将表单分成两个阶段,第一个阶段创建对象,第二个页面允许您添加可选信息(如照片)。

或者,您可以在用户输入信息时验证表单,这样您就不必提交表单来发现您的数据无效。