aiswarya nathan
aiswarya nathan

Reputation: 21

Multiple images(Nested) not getting uploaded via paperclip in ruby on rails

I am developing a website in ruby on rails. I want to upload multiple images while creating post using paperclip. I could not find any images being uploaded into the public folder and hence images are not getting displayed when I create new post. I have created a model called Postimage.rb for images and referenced to already existing model "post".I have used paperclip to upload single image in other models and it is working fine.

rails g model postimage post:references caption:string
rails g paperclip post_images photo

Here is the Postimage.rb

class Postimage < ActiveRecord::Base
  belongs_to :post
   has_attached_file :photo, 
:styles => {:small => "100x100>", :medium => "640x480>"}
validates_attachment_content_type :photo, :content_type => /\Aimage\/.*\Z/
end

And in the Post model,

class Post < ActiveRecord::Base
has_many :postimages
accepts_nested_attributes_for :postimages, :allow_destroy => true, :reject_if => lambda { |t| t[:postimage].nil? }

Here is the code in post controller

class PostsController < ApplicationController
  before_action :set_post, only: [:show, :edit, :update, :destroy]
  respond_to :html

  def index
    @posts = Post.all.order('created_at DESC').paginate(page: params[:page],:per_page =>7)
    @users = User.all
    respond_with(@posts)
  end

  def show
   respond_with(@post)
  end

  def new
    @post = Post.new
    5.times {@post.postimages.build} # added this
    respond_with(@post)
  end

  def edit
  5.times{@post.postimages.build}  # ... and this
  end

  def create
  @post = current_user.posts.build(post_params)
  @post.user_id = current_user.id
   if @post.save
    redirect_to @post, :notice =>"Post created successfully!!"
   else
    render "new"
   end
  end

  def update
    @post.update(post_params)
    respond_with(@post)
  end

  def destroy
    @post.destroy
     redirect_to preschools_Home_path
     #respond_with(@post)
  end

  private
    def set_post
      @post = Post.find(params[:id])
    end

    def post_params
      params.require(:post).permit(:title, :content, postimages_attributes: [:caption, :photo])
    end

Here is the code in _form.html in posts

<%= form_for(@post, :html =>{:multipart => true }) do |f| %>

<%=f.fields_for :postimages do |builder| %>
<%if builder.object.new_record? %>
<p>
<%= builder.label :caption, "Image Caption" %>
<%= builder.text_field :caption %>
</p>
<p>
<%= builder.label :photo, "Image File" %>
<%= builder.file_field :photo %>
</p>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

Here is the code in show.html.erb in posts

<div>
<% @post.postimages.each do |postimage|%>
<%= image_tag (postimage.photo.url(:medium))%>
<% end %>
</div>

Can you please help me. Thanks.

I have added image column to post model. And that image is getting displayed. But in the case of multiple upload, it is not working.

Logs code below might help.

Parameters: {"utf8"=>"✓", "authenticity_token"=>"PHcPmsB+a0qy6tn4U/nRyycjGFYHiFuum7LNqO8EX24+mGq+Yu7Ct0Ls/odNyAjUtVkT1cMImYRYwnpVajQRXA==", "post"=>{"title"=>"1st post",  "content"=>"Added image", "postimages_attributes"=>{"0"=>{"caption"=>"1st image", "photo"=>#<ActionDispatch::Http::UploadedFile:0x007f4a351b0ba8 @tempfile=#<Tempfile:/home/ubuntu/workspace/website/RackMultipart20150715-1790-7hfszv.jpg>, @original_filename="Murali.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"post[postimages_attributes][0][photo]\"; filename=\"Murali.jpg\"\r\nContent-Type: image/jpeg\r\n">}

Upvotes: 1

Views: 223

Answers (1)

Asitha De Silva
Asitha De Silva

Reputation: 183

The solution provided below works with Paperclip as well:

Rails 4 multiple image or file upload using carrierwave

Only difference would be in post_attachment.rb

Instead of:

class PostAttachment < ActiveRecord::Base
   mount_uploader :avatar, AvatarUploader
   belongs_to :post
end

You would have

class PostAttachment < ActiveRecord::Base
  belongs_to :post
  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
  validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/  
end

Upvotes: 1

Related Questions