0

我需要下载二进制数据。我已经尝试过send_data方法,但它保存了整个.html 页面。我无法访问send_data控制器之外的方法,所以我在应用控制器中声明了 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

我做错了什么?谢谢你。

4

2 回答 2

2

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

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

于 2013-10-10T10:22:01.880 回答
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

在您看来,您只有一个指向该 text#hello 路由的正常链接。

于 2013-10-10T10:19:18.907 回答