Rails中的link_to下载文件

9

我需要添加一个链接以从assets/docs/Физика.pdf下载文件,但我不知道如何操作。我正在尝试在视图中进行操作-

<%= link_to "download", '/Физика.pdf', :download => 'filename' %>

我收到一个错误信息:
No route matches [GET] "/%D0%A4%D0%B8%D0%B7%D0%B8%D0%BA%D0%B0.pdf"

我做错了什么? 请帮助我。

请尝试使用此链接 - davidhu
1
也许只需要 <%= link_to '下载', '/assets/docs/Физика.pdf' %> 或者 <%= link_to '下载', asset_path('/docs/Физика.pdf') %> - HarlemSquirrel
@HarlemSquirrel 你的答案是正确的答案。 - buncis
8个回答

9
你可以按照以下步骤进行操作: 步骤1:打开文件 routes.rb
get 'download_pdf', to: "homes#download_pdf"

步骤2: 我假设你的controller文件名是home_controller.rb,请添加以下代码:

def download_pdf
  send_file "#{Rails.root}/app/assets/docs/Физика.pdf", type: "application/pdf", x_sendfile: true
end

步骤3:在您的view文件中。

<%= link_to "download", download_pdf_path %>

我建议您将这个docs文件夹放在public文件夹中。
例如:public/docs/*.pdf

在 Rails 7 上运行顺畅。 - rdornas

5
步骤1:视图
<%= link_to "download", download_path, target: "_blank"%>

第二步:路由

match 'download', to: 'home#download', as: 'download', via: :get

第三步:控制器内部

send_file 'public/pdf/user.png', type: 'image/png', status: 202

2

当将文件放置在/assets目录中时,您可以使用Rails助手#asset_path

<%= link_to 'download', asset_path('/docs/Физика.pdf') %>

来源:http://guides.rubyonrails.org/asset_pipeline.html#asset-organization

资产组织 ==========
在 Rails 应用程序中,所有的 JavaScript 和 CSS 文件都被放置在 `app/assets` 目录下。这些文件可以通过使用 Sprockets 指令来引用其他文件或库。
Sprockets 是一个 Ruby 库,它可以将多个 JavaScript 或 CSS 文件合并成一个文件,并对其进行压缩和优化。这样可以减少页面加载时间和带宽占用。
在生产环境中,Rails 会自动将这些文件打包成一个单独的文件。这个文件通常被称为“资产清单”(Asset Manifest)。资产清单包含了应用程序中所有的 JavaScript 和 CSS 文件。
在开发环境中,这些文件不会被打包成单独的文件。相反,每个文件都会被单独加载,以方便调试和开发。

2

奇怪的是,在您的link_to助手中使用HTML download属性即可完成此操作。

<%= link_to "Download", file.file(:original, false), download:true %>

希望这能在未来对您有所帮助!

1
你应该将文件名传递给“download”,即download: file.filename,而不是download: true - IvanSelivanov

1
尝试这个:

<%= link_to 'download', root_path << '/assets/docs/Физика.pdf' %>

没有帮助( 没有匹配的路由[GET] "/assets/docs/%D0%A4%D0%B8%D0%B7%D0%B8%D0%BA%D0%B0.pdf" - Stiven Frams
@StivenFrams,你解决了吗?我也遇到了同样的错误。 - Anubhi Golechha

1

对我来说最有效且最简单的方法是:

= link_to "Click to download", asset_path("logo.png"), download: true

如果不是使用 Haml 或 Slim 而是使用 HTML,我会点赞。 - buncis

0

Rails 6 解决方案:

步骤1:在你的routes.rb文件中创建下载路由:

get 'download_pdf', to: "homes#download_pdf"

步骤2:将链接添加到您的视图中:

<%= link_to "download", download_single_path(url: 'url', file_name: 'filename') %>

步骤三:在您的控制器homes_controller.rb中添加操作,以获取您在link_to中传递的参数:

def download_pdf
  require 'open-uri'
  url = params[:url]
  file_name = params[file_name]
  data = open(url).read
  send_data data, :disposition => 'attachment', :filename=>"#{file_name}.pdf"
end

0

文档说明了如何构建附件文件的下载链接,应该像这样

<a href="<%= user.avatar.attached? ? rails_blob_path(user.avatar, disposition: 'attachment') : '#' %>" target="_blank" download>Link</a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接