我继承了一个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此对象上的方法返回nil并MiniMagick::Image.from_file爆炸.
当从该调用这个相同的模型方法时PhotosController,open(self.public_filename)返回FileIO绑定到例如名为的文件的实例,/tmp/open-uri7378-0并且该文件包含图像数据.
考虑原因必须是测试和开发之间的一些环境差异,我在开发环境下启动了控制台.但正如在单元测试中,open('http://...')返回一个StringIO,而不是一个FileIO.
我已经通过open-uri和所有相关的应用程序特定代码进行了跟踪,并且没有找到差异的理由.
将Twitter API允许你通过他们的媒体添加到您的鸣叫update_with_tweet方法。
我正在使用Sinatra并Twitter设置了所有配置。我能够成功地使用我的应用发布推文。
我的应用程序读取网页,从该页面提取照片,然后应该将它们单独发布到 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。