Как я могу создать несколько объектов в одной форме в Rails 3.1? - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть фотомодель, и я хочу настроить форму, чтобы пользователь мог создавать несколько фотографий из одной формы.Я наблюдал Railscasts # 196 и 197 на вложенных модельных формах, но это более сложно, чем то, что мне нужно, и больше касается форм, содержащих несколько моделей, а не несколько объектов одной модели.Ниже приведен мой код для простой формы, которая позволяет пользователю прикрепить изображение и создать новый объект Photo.Я экспериментировал с fields_for и пытался вложить, но это кажется слишком сложным, и я не могу заставить его работать.Любые идеи о том, как я мог бы настроить эту форму, чтобы позволить пользователю прикрепить 5 изображений для создания 5 новых объектов Photo?

<%= form_for(@photo, :html => { :class => "form-stacked", :multipart => "true" } )  do |f| %>
  <div class="clearfix">
    <%= f.file_field :image %>
  </div>
  <div><%= f.submit "Upload", :class => "btn primary" %></div>
<%end %>

Ответы [ 2 ]

1 голос
/ 29 марта 2012

В итоге я использовал plupload для загрузки нескольких файлов (фото) с помощью carrierwave. Я использовал драгоценный камень plupload-rails и следующий код, и все работает хорошо:

<%= javascript_tag do %>
    $(function(){
        var uploader = $('#uploader').pluploadQueue({
            runtimes : "html5, gears,flash,silverlight,browserplus",
            max_image_size : '100mb',
            url : "/photos",
            unique_names : true,
            multipart: true,
            preinit: attachCallbacks,
            multipart_params: {
                "authenticity_token" : '<%= form_authenticity_token %>'
            },

            flash_swf_url : '/plupload/js/plupload.flash.swf',
            silverlight_xap_url : '/plupload/js/plupload.silverlight.xap'

        }); //end initial script

        //redirect after complete
        function attachCallbacks(uploader) {
            uploader.bind('FileUploaded', function(Up, File, Response) {
                if((uploader.total.uploaded + 1) == uploader.files.length){
                    var filesAdded = uploader.files.length;
                    window.location = "<%=j edit_individual_photos_path %>"+ '?files=' + filesAdded;
                }
            });
        }
    }); //end function
<% end %>


<div class="" id="uploader"></div>

Надеюсь, это поможет кому-то начать.

0 голосов
/ 15 февраля 2012

Мне нравится камень Райана Бейтса Nested_Form, потому что я ленивый. Но я бы сделал это

<%= semantic_nested_form_for @user, :html => {:multipart => true} do |f| %>


  <%= f.fields_for :photo %>
  <p><%= f.link_to_add "Add Photo", :photo %></p>


  <div class="actions">
    <%= f.submit :class => "btn-success" %>
  </div>

<% end %>

Затем _photo.erb частичное

<div class="clearfix">
  <%= f.file_field :image %>
</div>

По поводу вашего комментария:

Я думаю, что это то, что вы ищете, я сделал это для вас здесь (на основе эпизода с Railsast carrierwave):

https://github.com/rbirnie/image-upload

Основной источник:

Галерея модели

class Gallery < ActiveRecord::Base
  attr_accessible :name, :paintings_attributes
  has_many :paintings
  accepts_nested_attributes_for :paintings
end

Картины модели:

class Painting < ActiveRecord::Base
  attr_accessible :gallery_id, :name, :image, :remote_image_url
  belongs_to :gallery
  mount_uploader :image, ImageUploader
end

Редактирование галереи

<%= nested_form_for @gallery, :html => {:multipart => true} do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>

  <%= f.fields_for :paintings do |photo_form| %>
    <%= photo_form.label :name %>
    <%= photo_form.text_field :name %>
    <%= photo_form.file_field :image %>
    <%= photo_form.link_to_remove "Remove this photo" %>
  <% end %>

<p><%= f.link_to_add "Add a photo", :paintings %></p>

  <p><%= f.submit %></p>
<% end %>

~

...