Rails send_data从控制器创建空白文件

时间:2016-12-08 20:01:16

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

我正在尝试下载一个充满字符串的文件。但是,无论我尝试哪种方式,该文件最终都是空白的。

以下是相关代码:

  def export(notes)
    stream = render_to_string(:template=>"cards/export.enex.erb", :locals => {:notes => notes}, :formats => [:enex])
    send_data(stream.to_s, :filename => "notes.enex")
  end

我一直在使用Rails.logger.info来尝试追踪问题,并确认流不为空,并且(当提示时)我的日志显示该文件已发送完整的正确数据。我正在使用自定义mime类型(enex),这在config中都已正确设置。我尝试了几种不同的方法,没有任何效果。以下是其他一些尝试:

(1)

  @notes = notes
  render file: "cards/export", formats: [:enex], type: 'text/plain', disposition: 'attatchment; filename=cards.enex'

(2)

  render template: "cards/export", formats: [:enex], :locals => {:notes => notes}, type: 'text/plain', disposition: "attatchment", filename: "notes.enex"

(3)

  send_file 'app/views/cards/export.enex.erb', type: 'application/enex', disposition: "attachment; filename=notecards.enex", :x_sendfile=>true

在每种情况下,文件都以空白结束。

如您所见,我正在使用的字符串是通过填写erb表单来创建的。如果重要,“notes”是我用来填写表单的哈希。我知道如何通过使用视图上的按钮和控制器中的respond_to来使其工作,但我故意不使用数据库,并且更愿意使用私有控制器方法解决问题,如图所示。

我正在使用Rails 4

你能看到任何会导致send_data失败的东西吗?

1 个答案:

答案 0 :(得分:0)

尝试使用send_file,但不是给它指向erb的路径,而是给它指向使用该模板生成的文件的路径,并将类型指定为application / xml或text / xml。我没有enex文件的经验,但我认为这可以简化问题。

file = "my_file.enex"
File.open(file, "w") do |f| 
   f << render_to_string(:template=>"cards/export.enex.erb", :locals => {:notes => notes}, :formats => [:enex]) 
end
send_file(file.path, type: "application/xml")