【问题标题】:Undefined local variable or method - download a file - Ruby on Rails未定义的局部变量或方法 - 下载文件 - Ruby on Rails
【发布时间】:2016-02-17 03:54:50
【问题描述】:

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

ActionView::Template::Error(# 的未定义局部变量或方法 `home_download_pdf_url'):

home_controller.rb

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

routes.rb

 get 'home/download_pdf'

view.html

<%= link_to 'Download Brochure', home_download_pdf_url>

我是 Ruby 的新手。请帮忙。

【问题讨论】:

  • 您的 routes.rb 文件中有 download_pdf 条目吗?如果是这样,那么您需要在 _url 方法中将操作放在控制器名称的前面。所以,应该是download_pdf_home_url。试一试,看看你是否进入了控制器操作。
  • &lt;%= link_to 'Download Brochure', home_download_pdf_url %&gt; 确保正确关闭标签

标签: ruby-on-rails ruby download link-to


【解决方案1】:

你的使用行为

下载_pdf

所以链接可以改为

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      #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
      

      【讨论】:

      • 为了子孙后代,如果它有效,你会想要接受答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多