Rails 4使用carrierwave和嵌套表单上传多个文件

时间:2015-10-08 16:31:39

标签: ruby ruby-on-rails-4 file-upload carrierwave nested-forms

我有一个包含许多图片的目录项,并尝试使用嵌套表单和carrierwave通过一个请求上传所有图像。我也使用响应者,haml和简单的形式。 所以,它就像是:

item.rb的

containerView

image.rb

rectForZoomingTransition

_form.html.haml

class Item < ActiveRecord::Base
  has_many :images, dependent: :destroy
  accepts_nested_attributes_for :images
end

items_controller.rb

class Image < ActiveRecord::Base
  belongs_to :item
  mount_uploader :image, ImageUploader
end

我是铁杆的新手,显然不按照我想要的方式工作。它会保存项目并完全忽略所有图像。

所以,我想知道,有没有办法在没有像

这样的结构的情况下实现我的目标
= simple_form_for(@item, :html => {:multipart => true }) do |f|
  = f.error_notification

  .form-inputs
    = f.input :name
    = f.input :description
    = f.input :price

  = simple_fields_for :images do |image|
    = image.file_field :image, multiple: true

  .form-actions
    = f.button :submit

2 个答案:

答案 0 :(得分:3)

所以,最后我找到了答案。我的html表单中有一些错误。 第一个错误非常明显。我用了

= simple_fields_for :images do |image|

而不是

= f.simple_fields_for :images do |image|
_form.html.haml 中的

我读完后发现的第二个article. 所以我将嵌套的表单更改为:

= f.simple_fields_for :images, Image.new do |image_form|
    = image_form.file_field :image, multiple: true,
                   name: "item[images_attributes][][image]"

正如Pavan建议的那样,在 items_controller.rb 中以复数形式使用 images_attributes

def item_params
  params.require(:item).permit(
    :name, :description, :price,
    images_attributes: [:image]
  )
end

就是这样。

答案 1 :(得分:0)

尝试将new方法更改为以下内容

def new
  @item = Item.new
  @item.images.build
  respond_with(@item)
end

此外,当您上传 多个图片 时,请将item_params更改为

以下
def item_params
  params.require(:item).permit(:name, :description, :price, images_attributes: [:image => []])
end