Here's the complete solution for loading multiple images using Carrierwave: To do this, follow these steps.
rails new multiple_image_upload_carrierwave
In gem file
gem 'carrierwave'
Then run the following
bundle install rails generate uploader Avatar
Create post scaffold
rails generate scaffold post title:string
Create post_attachment scaffold
rails generate scaffold post_attachment post_id:integer avatar:string
Then run
rake db:migrate
In post.rb
class Post < ActiveRecord::Base has_many :post_attachments accepts_nested_attributes_for :post_attachments end
In post_attachment.rb
class PostAttachment < ActiveRecord::Base mount_uploader :avatar, AvatarUploader belongs_to :post end
In post_controller.rb
def show @post_attachments = @post.post_attachments.all end def new @post = Post.new @post_attachment = @post.post_attachments.build end def create @post = Post.new(post_params) respond_to do |format| if @post.save params[:post_attachments]['avatar'].each do |a| @post_attachment = @post.post_attachments.create!(:avatar => a, :post_id => @post.id) end format.html { redirect_to @post, notice: 'Post was successfully created.' } else format.html { render action: 'new' } end end end private def post_params params.require(:post).permit(:title, post_attachments_attributes: [:id, :post_id, :avatar]) end
In views / posts / _form.html.erb
<%= form_for(@post, :html => { :multipart => true }) do |f| %> <div class="field"> <%= f.label :title %><br> <%= f.text_field :title %> </div> <%= f.fields_for :post_attachments do |p| %> <div class="field"> <%= p.label :avatar %><br> <%= p.file_field :avatar, :multiple => true, name: "post_attachments[avatar][]" %> </div> <% end %> <div class="actions"> <%= f.submit %> </div> <% end %>
Change the attachment and attachment list for any message. In views / posts / show.html.erb
<p id="notice"><%= notice %></p> <p> <strong>Title:</strong> <%= @post.title %> </p> <% @post_attachments.each do |p| %> <%= image_tag p.avatar_url %> <%= link_to "Edit Attachment", edit_post_attachment_path(p) %> <% end %> <%= link_to 'Edit', edit_post_path(@post) %> | <%= link_to 'Back', posts_path %>
Update the form for editing attachments / post _attachments / _form.html.erb
<%= image_tag @post_attachment.avatar %> <%= form_for(@post_attachment) do |f| %> <div class="field"> <%= f.label :avatar %><br> <%= f.file_field :avatar %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
Change the update method in post_attachment_controller.rb
def update respond_to do |format| if @post_attachment.update(post_attachment_params) format.html { redirect_to @post_attachment.post, notice: 'Post attachment was successfully updated.' } end end end
In rails 3, there is no need to define strong parameters and how you can define the access_ attribute in both the model and accept_nested_attribute to publish the model because the available attribute is deprecated on rails 4.
To edit attachments, we cannot change all attachments at once. so we will replace the application one at a time or you can change according to your rule. Here I just show you how to update any attachment.