2015-10-19 3 views
1

У меня есть приложение, в котором пользователь может создать gallery, к которому он может прикреплять некоторые изображения. Для этой цели я использую несущую волну, и она структурирована следующим образом. У каждого gallery есть много pictures, и каждый picture имеет 1 image.RoR: Вложенное поле в форме

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

Вы будете лучше делать следующее:

#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 %> 

Это будет передавать атрибуты, необходимые для ваших связанных моделей.

+0

Благодарим вас за ответ. Я получаю следующую ошибку 'undefined method 'title' для # ', хотя столбец 'title' присутствует в таблице' pictures' – sjbuysse

+0

Работает ли это, если вы удаляете заголовок 'p.text_field: title 'проверить? –

+0

Более или менее, я могу загрузить форму сейчас, но никакая фотография не создается, когда я отправляю (я тоже не вижу ее в написанном вами действии) – sjbuysse

Смежные вопросы