用于#<actionview :: base的未定义方法`send_file':0x5fb3650> </actionview :: base:0x5fb3650>

时间:2012-09-12 13:59:39

标签: ruby-on-rails

我正在尝试创建一个从文件系统下载文件的链接。为此,我在“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

1 个答案:

答案 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将是一本很好的书。