轨。如何通过send_data下载数据?

时间:2013-10-10 10:08:56

标签: ruby-on-rails ruby ruby-on-rails-4

我需要下载二进制数据。我尝试了send_data方法,但它保存了整个 .html页面。 我无法访问控制器中的send_data方法,因此我在app控制器中声明了helper_method。

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method :save_data

  def save_data
    send_data('Hello, pretty world :(', :type => 'text/plain', :disposition => 'attachment', :filename => 'hello.txt')
  end

end

我做错了什么?谢谢。

2 个答案:

答案 0 :(得分:2)

有一个原因send_data只能从控制器中使用 - 这是因为从其他地方使用它是没有意义的。 send_data执行而不是渲染视图,因此如果从视图中调用它,当Ruby到达命令时它已经开始将渲染视图写入响应,这就是为什么你会得到完整的HTML页面。

您需要将其设为控制器方法。一旦有了路径,就可以使用该路由的帮助器将一个链接放到视图中的控制器方法 - 而不是文件数据本身。

答案 1 :(得分:1)

您必须致电send_data而不是渲染视图。将它作为辅助方法并从视图中调用它根本没有任何意义。

简而言之:您必须拥有send_data且无视图的控制器方法:

class TextController < ApplicationController
  def hello
    send_data('Hello, pretty world :(', 
              :type => 'text/plain', :disposition => 'attachment', :filename => 'hello.txt')
  end 
end

在您的视图中,您只有一个指向该文本的正常链接#hello route。