相关疑难解决方法(0)

为什么Ruby open-uri打开在我的单元测试中返回一个StringIO,但在我的控制器中是一个FileIO?

我继承了一个Rails 2.2.2应用程序,用于在Amazon S3上存储用户上传的图像.基于attachment_fu的Photo模型提供了一种rotate方法,用于open-uri从S3和MiniMagick中检索图像以执行旋转.

rotate方法包含此行以检索用于MiniMagick的图像:

temp_image = MiniMagick::Image.from_file(open(self.public_filename).path)
Run Code Online (Sandbox Code Playgroud)

self.public_filename 返回类似的东西

http://s3.amazonaws.com/bucketname/photos/98/photo.jpg
Run Code Online (Sandbox Code Playgroud)

检索图像并旋转它在生产和开发中正在运行的应用程序中工作正常.但是,单元测试失败了

TypeError: can't convert nil into String
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `initialize'
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `open'
    /Users/santry/Development/totspot/vendor/gems/mini_magick-1.2.3/lib/mini_magick.rb:34:in `from_file'
Run Code Online (Sandbox Code Playgroud)

原因是当在单元测试的上下文中调用模型方法时,open(self.public_filename)返回StringIO包含图像数据的对象.path此对象上的方法返回nilMiniMagick::Image.from_file爆炸.

当从该调用这个相同的模型方法时PhotosController,open(self.public_filename)返回FileIO绑定到例如名为的文件的实例,/tmp/open-uri7378-0并且该文件包含图像数据.

考虑原因必须是测试和开发之间的一些环境差异,我在开发环境下启动了控制台.但正如在单元测试中,open('http://...')返回一个StringIO,而不是一个FileIO.

我已经通过open-uri和所有相关的应用程序特定代码进行了跟踪,并且没有找到差异的理由.

ruby open-uri ruby-on-rails imagemagick amazon-s3

30
推荐指数
2
解决办法
8478
查看次数

Sinatra、Twitter 和 StringIO

Twitter API允许你通过他们的媒体添加到您的鸣叫update_with_tweet方法。

我正在使用SinatraTwitter设置了所有配置。我能够成功地使用我的应用发布推文。

我的应用程序读取网页,从该页面提取照片,然后应该将它们单独发布到 Twitter。我成功地使用Nokogiri.

但是,我无法将这些照片转换为Twitter允许的媒体类型。因为我也在使用urigem,给出这个例子:photo_url = "placekitten.com/300/300",我可以调用media = open(photo_url),这会返回一个StringIO.

但是,当我尝试将新存储的媒体与我的帖子一起发布给Twitter我时,出现了The IO object for media must respond to to_io (Twitter::Error::UnacceptableIO).

我试图弄清楚如何正确格式化/调用图像,以便我可以成功地将其发布到 Twitter。

twitter sinatra stringio

2
推荐指数
1
解决办法
624
查看次数