How to upload image, word docs and/or PDF files via Paperclip rails 4

paperclip, ruby-on-rails

Solution

It depends...

If you want to attach an image AND a document you need to create another paperclip attribute for the document. On your model:

has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" }
validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }

has_attached_file :document
validates_attachment :document, :content_type => { :content_type => %w(application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document) }

If you want to attach an image OR a document you can do the following:

has_attached_file :document
validates_attachment :document, :content_type => {:content_type => %w(image/jpeg image/jpg image/png application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document)}

If you choose the first option you will need two file inputs on your view, with the second only one. It's not right or wrong on this. It depends what you want to do.

Problem

I would like to enable users to upload Word Docs and PDF files to my rails application. My app is similar to a Pinterest app, users can create Pins where they attach a picture followed by a description (used Paperclip to attach the image to the Pin). Here is my Pins model: ``` class Pin < ActiveRecord::Base belongs_to :user has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" } validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] } validates :image, presence: true end ``` My Pins controller: ``` class PinsController < ApplicationController before_action :set_pin, only: [:show, :edit, :update, :destroy] before_action :correct_user, only: [:edit, :update, :destroy] before_action :authenticate_user!, except: [:index, :show] def index @pins = Pin.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 15) end def show end def new @pin = current_user.pins.build end def edit end def create @pin = current_user.pins.build(pin_params) if @pin.save redirect_to @pin, notice: 'Pin was successfully created.' else render action: 'new' end end def update if @pin.update(pin_params) redirect_to @pin, notice: 'Pin was successfully updated.' else render action: 'edit' end end def destroy @pin.destroy redirect_to pins_url end private def set_pin @pin = Pin.find(params[:id]) end def correct_user @pin = current_user.pins.find_by(id: params[:id] ) redirect_to pins_path, notice: "Not authorized to edit this Pin" if @pin.nil? end def pin_params params.require(:pin).permit(:description, :image) end end ``` I wonder if I just need to create another `has_attached_file` method for the Word docs and PDFs files within my Pin model and then create a view for users to upload the file.

Original source