ruby-on-railsruby-on-rails-3hyperlinkdownloadlink-to

file download link in rails


I would like to give visitors the option to download some pdf. I have tried:

<%= link_to "abc", "/data/abc.pdf"%>

<%= link_to "abc", "/data/abc.pdf", :format => 'pdf' %>

and some variations but they don't seem to work. I keep getting No route matches [GET] "/data/abc.pdf"

I have the pdf files in a folder called data, located in the assets folder. Any help would be appreciated.


Solution

  • Rails 4:

    in routes:

    get "home/download_pdf"
    

    in controller (already have pdf):

    def download_pdf
      send_file(
        "#{Rails.root}/public/your_file.pdf",
        filename: "your_custom_file_name.pdf",
        type: "application/pdf"
      )
    end
    

    in controller (need to generate pdf):

    require "prawn"
    class ClientsController < ApplicationController
    
      def download_pdf
        client = Client.find(params[:id])
        send_data generate_pdf(client),
                  filename: "#{client.name}.pdf",
                  type: "application/pdf"
      end
    
      private
    
      def generate_pdf(client)
        Prawn::Document.new do
          text client.name, align: :center
          text "Address: #{client.address}"
          text "Email: #{client.email}"
        end.render
      end
    end
    

    in view:

    <%= link_to 'Download PDF', home_download_pdf_url %>
    

    Rails 3

    The way to do it:

    def download
      send_data pdf,
        :filename => "abc.pdf",
        :type => "application/pdf"
    end
    

    You should go to this alternative

    Rails < 3

    File in public folder

    This may the the answer to you: How to download a file from rails application

    You should place your file in public folder, that is the trick.

    Should work when the file is placed correctly.

    Let me know if you can't move your file to public folder.

    Download via controller

    Create a controller with a downlaod action and link_to it

      def download
        send_file '/assets/data/abc.pdf', :type=>"application/pdf", :x_sendfile=>true
      end