未定义的局部变量或方法 - 下载文件 - Ruby on Rails



我正在尝试在rails中嵌入一个可下载的文件。但是得到以下错误:

ActionView::Template::Error (未定义的局部变量或方法 'home_download_pdf_url' for #<#:0x007fd9f1a2eea0>(:

home_controller.rb

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

路线.rb

 get 'home/download_pdf'

查看.html

<%= link_to 'Download Brochure', home_download_pdf_url>

我是 Ruby 的新手。请帮忙。

您的使用操作为

download_pdf

所以链接到可以更改为

link_to "Download Brochure", controller: "home", action: "download_pdf"

如果您使用的是较旧的 Rails,请确保在更改路由后重新启动服务器。您也可以尝试替代路由语法get 'home/download_pdf' => 'home#download_pdf',运行rake routes以确保,您应该看到类似 home_download_pdf GET /home/download_pdf(.:format) home#download_pdf 的行。您可能也可以直接链接到该文件,因为它在公共目录link_to 'Download Brochure', 'Brochure.pdf'中,并且您对视图的检查#<#:0x007fd9f1a2eea0>是可疑的,自从我查看rails以来已经有一段时间了,但我希望它在那里有一个类名。通常视图文件是view.html.erb的,而不是view.html的,并且文件名名称有点可疑,从rails根目录到文件的完整路径是什么?我期待类似的东西app/views/home/index.html.erb通常文件名将位于以控制器命名的目录(因此是家(中,并且文件将以操作(呈现它的控制器方法(命名。这些惯例有偏差,但我无法判断你的是否是其中之一。

错误很简单,这意味着您没有使用引用的"名称"定义路由:

#config/routes.rb
get "home/download_pdf", to: "home#download_pdf", as: :home_download_pdf
#app/controllers/home_controller.rb
class HomeController < ApplicationController
  def download_pdf
    # ...
  end
end
#app/views/home/download_pdf.html.erb
<%= 'Download Brochure', home_download_pdf_path %>

作为提示,我们总是将"杂项"操作放在我们的ApplicationController中:

#config/routes.rb
get "download_pdf", to: "application#download_pdf", as: :home_download_pdf
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def download_pdf
    # ...
  end
end

--

如果您必须使用 home 控制器等,您最希望将任何额外的路由嵌入到 resources 指令中:

#config/routes.rb
resources :home, only: [] do
  get :home_download_pdf, on: :collection #-> url.com/home/home_download_pdf
end

最新更新