Rails - 使用一个form_for上传多个文件的问题

时间:2013-06-05 05:21:36

标签: ruby-on-rails ruby ruby-on-rails-3

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

感谢您的帮助!

新产品表单(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 个答案:

答案 0 :(得分:1)

这里使用了两个fields_for标记,它生成一个具有相同名称的输入文件元素。

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

答案 1 :(得分: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

如果要为照片实施“添加更多”按钮,可以使用宝石nested_form。非常好。

答案 2 :(得分:1)

答案 3 :(得分:1)

你可以使用Gem carrierwave作为服务器,你可以在前面使用plupload http://www.plupload.com/非常简单