2

我正在尝试创建一个链接以从文件系统下载文件。为此,我在“license_helper.rb”文件中定义了以下内容:

def license_download_link(license, link_text = nil)
    if link_text.blank?
      link_text = image_tag("download_icon.png", :border => 0, :width => 32, :height =>32,  :alt => 'Download License', :title => 'Download License')
    end

    licenseFileId = license.asset.serial_number
    send_file '#{licenseFileId}license.xml', :type => "application/xml", :filename => "#{licenseFileId}license.xml"
    #send_file ' "#{licenseFileId}license.xml" ', :disposition => 'inline'
    #send_file("#{licenseFileId}license.xml", :type => :xml)
    #link_to link_text, '#{"C:\\Entitlement\\trunk\\entitlement_site\\entitlement\\25license.xml"}'
end

我的“视图”只是调用这个助手类:

<td><%= license_download_link(license, ' ') %></td>

当我尝试查看该页面时,我收到以下错误消息:

undefined method `send_file' for #<ActionView::Base:0x5fb3650>

如您所见,我尝试了很多方法来调用“send_file”,但总是得到相同的错误消息。任何帮助将不胜感激,感谢您的时间,问候,--- AJ

4

1 回答 1

8

您需要send_file从控制器操作而不是从您的视图中调用。控制器动作被调用以响应用户点击它的链接。

在视图中,您只需要一个指向控制器操作的链接。


细节将取决于您的确切应用,但这里是零件如何组合在一起的粗略概述

生成控制器:

class LicenceController < ApplicationController
  def download
    # look up the licence and then use send_file
  end
end

然后,您可以编辑config/routes.rb为许可证下载创建一个友好的 URL,例如

match 'licences/:id/download' => 'licence#download', :as => 'licence_download'

这意味着表单的 URLlicences/xyz/download将调用您的download控制器方法,并且licence_download_url会自动为您创建一个辅助方法。

然后在你看来你可以做

<%= link_to 'Download your licence', licence_download_url(licence) %>

如果您想创建一个帮助方法来生成带有下载图标的链接,您也可以这样做。

如果您是 Rails 的新手,并且正在为如何将应用程序的各个部分组合在一起而苦苦挣扎,那么使用 Rails 进行敏捷 Web 开发将是一本好书。

于 2012-09-12T14:07:46.643 回答