我在我的一个邮件服务器中有一行代码,用来添加一个带有用户姓氏和道布的附件.在File.read方法中,有时会出现类型错误"没有将StringIO隐式转换为字符串".

attachments["#{@user.last_name.downcase}-#{@user.date_of_birth.strftime('%d%m%y')}.jpeg"] = File.read(URI.parse(@user.profile_picture_url).open)

它在大多数情况下都可以工作,但偶尔也会失败,并出现以下错误.我正在使用CarrierWave将文件上传到远程S3存储桶,如果这有什么不同的话.

编辑:

我在控制台中做了一些挖掘,坦率地说,这让我更困惑了!我有两个用户记录,都有通过CarrierWave上传到S3的个人资料照片.如果我只是隔离File.read方法,并使用两个记录try 它,一个有效,一个无效.判断URI,它们看起来几乎是相同的.

然而,我发现CarrierWave支持读取文件的快捷方式,解决了这个问题.以下是更新后的代码:

attachments["#{@user.last_name.downcase}-#{@user.date_of_birth.strftime('%d%m%y')}.jpeg"] = @user.profile_picture.read

推荐答案

任何小于10kb的值打开时都是StringIO,而不是File.在文档中找不到实际的引用,因此来源如下:

StringMax = 10240
def <<(str)
  @io << str
  @size += str.length

  # NOTE: once you pass 10kb mark, you get a tempfile.
  #                      v
  if StringIO === @io && StringMax < @size
    require 'tempfile'
    io = Tempfile.new('open-uri')
    io.binmode
    Meta.init io, @io if Meta === @io
    io << @io.string
    @io = io
  end
end

100


让我们来测试一下:

>> require "open-uri"

>> File.write("public/small.txt", "a"*10240)
=> 10240
>> URI.open("http://localhost:3000/small.txt").class
=> StringIO

>> File.write("public/large.txt", "a"*(10240+1))
=> 10241
>> URI.open("http://localhost:3000/large.txt").class
=> Tempfile

你可以File.readTempfile,但你不能File.readStringIO.

解决办法是在URI公路上拨打read:

>> URI.parse("http://localhost:3000/small.txt").read.class
=> String
>> URI.parse("http://localhost:3000/large.txt").read.class
=> String

# also works
>> URI.open("http://localhost:3000/small.txt").read.class
=> String

100

Ruby-on-rails相关问答推荐

未捕获语法错误:try 编辑TRIX时,请求的模块未在Rails 7.1中提供名为默认的导出(在youtube.js:1:8)

如何在Rails中创建没有字符串的查询

查询Where Date.parse Rails

这种使用on:的语法在 Ruby on Rails 中意味着什么?

如何使用 activerecord activerecord-session_store 在 Rails 应用程序中使用 cookie 值在数据库中查找会话记录

为什么 Rails 执行器不能识别内核的改进?

渲染:动作和渲染:模板之间的区别

如何在 Windows 上为 Ruby 安装 sqlite3?

rails 4 before_validation on: :create 或 on: :save

link_to 将参数与 url 一起发送并在目标页面上抓取它们

如何对这个哈希数组进行分组?

我如何在具有活动记录的 Rails 中使用两个不同的数据库?

Rails Associations - has_many => :through - 但相同的模型

Rails Devise:设置密码重置令牌并重定向用户

Post.all.map(&:id) 是什么意思?

在 Rails 中命名布尔列

Postgresql JSON 数据列不同

让 bundler 为不同的平台使用不同的 gem

rails 3,如何在 Settings.yml 文件中使用 ENV 配置变量?

.erb 、 .rhtml 和 .html.erb 有什么区别?