我正在尝试创建一个从文件系统下载文件的链接。为此,我在“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
答案 0 :(得分:7)
您需要从控制器操作中调用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'
这意味着licences/xyz/download
形式的网址会调用您的download
控制器方法,并且会自动为您创建licence_download_url
辅助方法。
然后在你看来你可以做到
<%= link_to 'Download your licence', licence_download_url(licence) %>
如果您想创建一个帮助方法来生成带有下载图标的链接,您也可以这样做。
如果您对Rails很陌生,并且正在努力解决应用程序各部分的组合问题,那么Agile Web Development with Rails将是一本很好的书。