我认为您正在尝试做的是使用 fields_for 帮助器的嵌套表单的一个很好的应用程序。
首先,您需要确保您的产品模型和照片模型具有正确的关联(一个产品可能有_many 张照片,而一张照片属于一个产品,对吧?)。然后,您将确保产品类“接受照片的嵌套属性”,这允许您从产品表单向照片模型添加属性。
在 products.rb 中
class Product
has_many :photos
accepts_nested_attributes_for :photos
end
在 photo.rb 中
class Photo
belongs_to :product
end
然后,您需要确保照片所需的任何属性都在您的产品参数中列入白名单。
在 products_controller.rb 中
private
def product_params
params.require(product).permit(:first_product_attribute, :second_produtc_attribute, photo_attributes: [:image])
end
最后,您将使用特殊帮助器 fields_for 创建表单
在你看来
<%= form_for @product, html:{multipart:true} do |f| %>
<div class="field">
<%= f.label :price %>
<%= f.text_field :price %>
</div>
<%= f.fields_for :photo do |t| %>
<div>
<%= t.label :image %>
<%= t.file_field :image, :multiple => true %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<%end%>
您还需要确保您实际上是在产品的创建操作中创建新照片对象:
在 products_controller.rb 中
def create
@product = Product.new(product_params)
if @product.save!
params[:photo]['image'].each do |img|
@photo = @product.photos.create!(:image => img)
end
flash[:success] = 'product saved!'
redirect_to @product
end
end
其中一些是基于我做同样事情的经验,但使用 Carrierwave 而不是 Paperclip,因此您的具体实现可能会有所不同。