-
-
Save iqbalhasnan/24905170bdfd182cd631 to your computer and use it in GitHub Desktop.
| <input id="photos_ids" name="photos" type="hidden" value=""> | |
| <input data-url="/photos" id="album_upload" multiple="multiple" name="images[]" type="file" ></input> |
| class Album < ActiveRecord::Base | |
| # belongs to user model | |
| belongs_to :user | |
| # Album has many photos | |
| has_many :photos, :inverse_of => :album, :dependent => :destroy | |
| # enable nested attributes for photos through album class | |
| accepts_nested_attributes_for :photos, allow_destroy: true | |
| end |
| class AlbumsController < ApplicationController | |
| # truncated for brevity. | |
| def create | |
| @album = current_user.albums.build(album_params) | |
| @album.photos << Photo.find(params[:photos].split(",")) | |
| authorize @album | |
| if @album.save | |
| flash[:notice] = "Your album has been created." | |
| redirect_to @album | |
| else | |
| flash[:alert] = "Something went wrong." | |
| render :new | |
| end | |
| end | |
| def album_params | |
| params.require(:album).permit(:title, :description, :photos_attributes => [:album_id, :image]) | |
| end | |
| end |
| $(function(){ | |
| var ids = []; | |
| $('#album_upload').fileupload({ | |
| done: function (e, data) { | |
| ids.push(data.result.picture_id); | |
| $('#photos_ids').val(ids); | |
| } | |
| }); | |
| }); |
| class Photo < ActiveRecord::Base | |
| #photo belongs to album | |
| belongs_to :album | |
| #validations | |
| validates :album, presence: true | |
| # Photo uploader using carrierwave | |
| mount_uploader :image, PhotoUploader | |
| def to_jq_upload | |
| { | |
| "url" => image.medium.url, | |
| "delete_url" => id, | |
| "picture_id" => id, | |
| "delete_type" => "DELETE" | |
| }.to_json | |
| end | |
| end |
| class PhotosController < ApplicationController | |
| # truncated for brevity. | |
| def create | |
| params[:images].each{ |image| | |
| @photo = Photo.create(image: image) | |
| if @photo.save | |
| respond_to do |format| | |
| format.html { render json: @photo.to_jq_upload, content_type: 'text/html', layout: false } | |
| format.json { render json: @photo.to_jq_upload } | |
| end | |
| else | |
| render json: { error: @photo.errors.full_messages }, status: 304 | |
| end | |
| } | |
| end | |
| end |
| This gist is the update of this post https://u.osu.edu/hasnan.1/2014/03/30/rails-4-multiple-file-upload-with-carrierwave-nested-form-and-jquery-file-upload/ | |
| License MIT |
@abbirdboy , if you want to create and upload photo at the same time, you will only need album controller.
in your album model make sure you have accepts_nested_attributes_for :photos, allow_destroy: true
and update your albums_controller to something like this
def create
@album = current_user.albums.build(album_params)
params[:images].each do |image|
photo = Photo.create(image: image)
photo.save
end
if @album.save
flash[:notice] = "Your album has been created."
redirect_to @album
else
flash[:alert] = "Something went wrong."
render :new
end
endand your form looks something like
<%= file_field_tag "album[images][]", type: :file, multiple: true %>Thank you! I was able to get it to work!
Why aren't you using fields_for in your view if you are using nested attributes?
Also, can you please share your album_params method when using only the Albums controller?
Thank you.
@BigChief45 update with album_params
Hello,
sorry, but I got stuck. I don't understand why we don't use <%= form.file_field :avatars, multiple: true %> for the _form.html.erb as described in https://github.com/carrierwaveuploader/carrierwave#multiple-file-uploads
Additionally should I render _form.html.erb in my user#new or in some other action? then the _form.html.erb triggers the function from album_upload.js, for the image preview, but It is not clear to me how the create action gets called from the submit button.
Sorry I am totally new to carrierwave!
1 ) you can use <%= form.file_field :avatars, multiple: true %> , but make sure you updated album_upload.js selector accordingly.
2 ) you should render the form in new and edit if there's any.
Hi, I've been using this code as the base plate for the album/photo upload segment of my project. At the moment I have an ajax form made with the simple_form (form for) gem for the album attributes (title and description) and then a 'nested' div that is tied to the Ajax file uploader Dropzone.js. When the submit button is clicked, two POST requests are sent, one to the album_controller from simple_form and the other to the photo_controller from the dropzone js. I suppose this might be similar to if I was using Jquery Upload. I'm a bit lost on how to properly implement a nested form where I am able to create an album and upload pictures at the same time. For example, how would the full view form look like, I see that on your form, there's only two input lines.
Thank you!