1

我刚刚安装了 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 中选择图像并单击保存(知道它将无法验证)时,它会显示我在提示中选择的图像,这很好。但是,图像输入仍然显示,如果我不填写任何表格并再次单击提交,它将再次无法验证,但这次图像消失了。

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

4

1 回答 1

2

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

另一种选择是当您已经将模型存储在数据库中时,使用其他形式的 ajax 上传文件。

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

于 2012-10-17T08:22:42.003 回答