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

标签 ruby-on-rails ruby-on-rails-3.2

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

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

上传的文件不是空的,当我检查 UploadedFile对象,它有一个类似 @tempfile=#<File:/tmp/RackMultipart20130530-34976-6jaqt5 的属性.如果我 cat文件系统上的那个文件,它包含我所期望的。

为什么可能.read返回一个空字符串?

我正在使用 Rails 3.2.13。

最佳答案

尝试倒带

我的同事建议调用rewind之前 read ,这行得通。显然其他一些代码首先读取文件。

更新

据我所知,没有人在我之前阅读文件。我创建了一个初始化程序来监视 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

我没有看到对 read 的任何其他调用.考虑到可能有一些其他方法可以推进读取指针,我更进一步并完全替换了该类:
# 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

依然没有。我看到一个调用 initialize ,我调用rewind ,我的电话是read .

似乎这个文件是预先缠绕到最后的。我不知道为什么会这样,但是 rewind对我来说仍然是修复。

关于ruby-on-rails - ActionDispatch::Http::UploadedFile#read 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16840613/

相关文章:

ruby-on-rails - React Rails 与 Webpacker 不热重载

ruby-on-rails - 通过关联两次创建对象的 has_many 嵌套属性

ruby-on-rails-3.2 - 如何将参数传递给 rails form_tag?

ruby-on-rails - 如何在 HABTM Rails Association 中创建记录 How make this?

Javascript 仅适用于页面上的某些位置

ruby-on-rails - 仅当资源具有特定属性时如何过滤搜索集合?

sql - 如何进行 JOIN 查询而不忽略具有 NULL 值的记录?

ruby-on-rails - 用 Rails 设计 4 : user show route doesn't exist

heroku - 如果 "git push heroku master"失败怎么办?

passenger - Authlogic 不适用于我的 Rails 3.2 应用程序