我需要下载二进制数据。我尝试了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
我做错了什么?谢谢。
答案 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。