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.
Plain old Ruby The most popular way to download a file without any dependencies is to use the standard library open-uri . open-uri extends Kernel#open so that it can open URIs as if they were files. We can use this to download an image and then save it as a file.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With