ruby-on-rails – ActionDispatch :: Http :: UploadedFile #read返回空字符串

我有一个Rails应用程序,我正在解析上传的CSV.我刚刚发现解析已停止工作并正在调查.

我已经将它追溯到我在Actiondispatch :: Http :: UploadedFile的实例上调用.read的事实,并返回一个空字符串.

上传文件不为空,当我检查UploadedFile对象时,它有一个像@tempfile =#< File:/ tmp / RackMultipart20130530-34976-6jaqt5这样的属性.如果我在文件系统上捕获该文件,它包含我期望的内容. 为什么.read会返回一个空字符串? 我正在使用Rails 3.2.13.

解决方法

尝试倒带

我的同事建议在阅读之前调用倒带,这样可行.显然其他一些代码正在首先读取文件.

更新

据我所知,在我之前没有人在阅读文件.我创建了一个初始化程序来监视UploadedFile:

# config/initializers/uploaded_file.rb
class Actiondispatch::Http::UploadedFile

  alias_method :old_read,:read
  def read(*args)
    Rails.logger.info "file #{self} is getting read by #{caller.first}!"
    old_read(*args)
  end
end

我没有看到任何其他的阅读电话.认为可能有一些其他方法被称为推进读指针,我进一步完全取代了类:

# config/initializers/uploaded_file.rb
Actiondispatch::Http::UploadedFile = Class.new do

  def initialize(*args)
    Rails.logger.info "initilized with #{args}"
  end

  def method_missing(method_name,*args,&block)
    Rails.logger.info "file got #{method_name} with #{args}.\
      Block? #{block_given?} caller? #{caller.first}"
  end

end

依然没有.我看到一个初始化的电话,我的倒带电话,以及我的阅读电话.

好像这个文件预先缠绕到最后.我不确定为什么会这样,但倒带仍然是我的解决方案.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...