我有一个创建产品页面,允许用户将多个图像添加到产品中。所以很自然地我有很多图像上传字段,但是当产品创建时,它只需要一张照片并将其添加到数据库中。不是其他人。我犯了一些简单的错误,但我不知道它是什么。
感谢您的帮助!
新产品表单(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
答案 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)
这可以通过嵌套属性实现。请阅读this Rails doc。
另见:
答案 3 :(得分:1)
你可以使用Gem carrierwave作为服务器,你可以在前面使用plupload http://www.plupload.com/非常简单