1

我有一个创建产品页面,允许用户向产品添加多个图像。所以很自然地,我有许多图像上传字段,但是,当产品创建时,它只会拍摄一张照片并将其添加到数据库中。不是其他人。我犯了一些简单的错误,但我不知道它是什么。

谢谢您的帮助 !

新产品形式(haml)

%h1 
  create item
= form_for @product,:url => products_path, :html => { :multipart => true } do |f|
  %p
    = f.label :name
    = f.text_field :name
  %p
    = f.label :description
    = f.text_field :description
  %p
    = fields_for :photo, :html => {:multipart => true} do |fp|
      =fp.file_field :image  
  %p
    = fields_for :photo, :html => {:multipart => true} do |fp|
      =fp.file_field :image  

  %p.button
    = f.submit

产品控制器

  def new 
    @product = Product.new
    @photo = Photo.new
  end


  def create
  @product = current_user.products.build(params[:product])
  @photo = current_user.photos.new(params[:photo])

    if @product.valid? && @photo.valid?
      @product.save
      @photo.product_id = @product.id
      @photo.save
      render "show", :notice => "Sale created!"
    else
      render "new", :notice => "Somehting went wrong!"
    end
end
4

4 回答 4

1

在这里,您使用了两个 fields_for 标签,它们生成了一个同名的输入文件元素。

所以总是你只保存一个文件,因为它们 bot 元素具有相同的名称,并且 rails 中的参数是通过使用输入元素名称传递的。所以在这里您需要使用 file_field_tag 并将参数捕获到控制器中以保存到数据库中。

于 2013-06-05T05:34:46.480 回答
1

服务端可以使用Gemcarrierwave,前端可以使用plupload http://www.plupload.com/,非常简单

于 2013-06-05T07:18:43.917 回答
1

这可以通过嵌套属性来实现。请阅读此 Rails 文档

另见:

于 2013-06-05T05:50:57.303 回答
1

您正在尝试实现嵌套属性表单。所以将 fields_for 部分更改为

%p
  = f.fields_for :photos do |fp|
    =fp.file_field :image

然后在控制器中更改您的新方法

def new 
  @product = Product.new
  3.times{ @product.photos.build }
end


def create
  @product = current_user.products.new(params[:product])
  if @product.valid?
    @product.save
    render "show", :notice => "Sale created!"
  else
    render "new", :notice => "Something went wrong!"
  end
end

您的模型应该与以下相关

class Product
  has_many :photos
  accepts_nested_attributes_for :photos, allow_destroy: true
end

class Photo
  attr_accessible :image
  belongs_to :product
end

如果您想为照片实现“添加更多”按钮,您可以使用 Gem nested_form。它非常好。

于 2013-06-05T05:46:31.837 回答