验证失败时ActiveAdmin丢失图像

时间:2012-10-13 04:32:19

标签: ruby-on-rails ruby-on-rails-3 activeadmin carrierwave image-uploading

我刚安装了ActiveAdmin并创建了一个表单,如:

form do |f|
  f.inputs "Details" do
    f.input :title
    f.input :published_on, as: :datepicker
  end
  f.has_many :images do |images_f|
    images_f.input :image, as: :file, hint: images_f.template.image_tag(images_f.object.image.url)
    images_f.input :description, as: :text, input_html: { rows: 3 }
  end
  f.has_many :topics do |t_f|
    t_f.input :maker
    t_f.input :title
    t_f.input :text
    t_f.input :image, as: :file, hint: t_f.template.image_tag(t_f.object.image.url)
    t_f.input :sort_order
  end
  f.buttons
end

我有一些强制性的感觉所以当我在has_many:images中选择一个图像时,我点击保存(知道它将无法验证),它向我显示我在提示中选择的图像,这很好。但是,图像输入仍然显示,如果我没有填写任何表格并再次点击提交,它将再次无法验证,但这次图像消失了。

有谁知道如何防止这种情况?这有点烦人。

1 个答案:

答案 0 :(得分:1)

没有标准的方法,HTML文件选择控件在Rails和其他框架中始终是空白的, 这也是大多数浏览器强制执行的。所以我认为这不是activeadmin的问题。这是因为  网页可以让你上传任意文件 通过隐藏用户的选择 其中一个自定义选项是使用上传文件的隐藏字段,并在验证失败时添加它们。因此,在验证开始之前,您必须将文件保存在任何位置(tmp目录或somethong),并在模型的虚拟属性中存储指向它们的链接。之后,您必须在表单中呈现隐藏字段,并在服务器上添加已上载文件的链接。而且,如果文件输入,您还可以显示链接,并可以删除它们。

另一个选择是当您已将模型存储在db中时,使用其他形式的ajax上载文件。

如果您希望模型是强制性的,则可以将模型标记为已禁用或使用某种临时模型,该模型是当前模型的副本。文件上传并且模型生效后,您可以将其状态更改为启用或将临时实例复制到另一个数据库表,具体取决于您的选择。