RoR:表单中的嵌套字段

时间:2015-10-19 09:25:05

标签: ruby-on-rails carrierwave nested-forms

我有一个应用程序,用户可以创建一个gallery,他/她可以附加一些图片。我为此目的使用了carrierwave,其结构如下。 每个gallery都有多个pictures,每个picture都有一个image

class Gallery < ActiveRecord::Base
    has_many :pictures, dependent: :destroy
    accepts_nested_attributes_for :pictures, allow_destroy: true;
end
class Picture < ActiveRecord::Base
    belongs_to :gallery
    mount_uploader :image, ImageUploader
end

图片以下列表格上传

<%= form_for(@gallery, html: {multipart: true}) do |f| %>
    <%= f.label :title %><br />
    <%= f.label :pictures %><br />
    <% if @gallery.pictures %>
        <ul class="form-thumbs clearfix">
        <% @gallery.pictures.each do |picture| %>
            <li>
                <%= image_tag(picture.image) %> 
                <%= link_to "Delete", gallery_picture_path(@gallery, picture), method: :delete %>
           </li>
        <% end %>
        </ul>
    <% end %>
    <%= file_field_tag "images[]", type: :file, multiple: true %>
<% end %>

然后使用以下操作进行处理

class GalleriesController < ApplicationController
    def create
        @gallery = Gallery.new(gallery_params)
        if @gallery.save
            if params[:images]
                params[:images].each do |image|
                    @gallery.pictures.create(image: image)
                end
            end
        end
    end
 end

这一切都运作良好,但现在我想添加一个嵌套字段:title,这样当我打开表单并上传图片时,我可以为每张图片添加标题。任何人都可以解释我如何适应现有的形式吗?

1 个答案:

答案 0 :(得分:1)

你最好做以下事情:

#app/controllers/galleries_controller.rb
class GalleriesController < ApplicationController
   def new
       @gallery = Gallery.new
       @gallery.pictures.build
   end

   def create
       @gallery = Gallery.new gallery_params
       @gallery.save
   end

   private

   def gallery_params
       params.require(:gallery).permit(:title, pictures_attributes: [:image, :title])
   end
end

这将使您能够使用以下内容:

#app/views/galleries/new.html.erb
<%= form_for @gallery do |f| %> 
   <%= f.text_field :title %>
   <%= f.fields_for :pictures do |p| %>
      <%= p.text_field :title %>
      <%= p.file_field :image %>
   <% end %>
   <%= f.submit %>
<% end %>

这会将您需要的属性传递给关联的模型。