Codecademy显示可以通过类似(在seeds.rb中)的URL来播种图像:
t1 = Tag.create(title: "Beaches", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach01.jpg")
Destination.create(name: "Ipanema", description: "The beach of Ipanema is known for its elegant development and its social life.", image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg", tag_id: t1.id)
但是,如果我想要使用本地文件呢?我的文件路径由Ruby提供
File.join(Rails.root,'db','images','Event1.jpg')
我尝试使用
image: File.open(File.join(Rails.root,'db','images','Event1.jpg'))
取代
image: "http://s3.amazonaws.com/codecademy-content/courses/learn-rails/img/beach02.jpg"
但它不起作用。
目前我正在使用
访问视图中的图像<%= image_tag t.image %>
我怎样才能做到这一点?
答案 0 :(得分:0)
你必须首先围绕一些概念:
File.open
或File.new
返回的对象。这些只是引用流的IO对象(更多关于它here)。至少您需要使用File.read
获取图片的内容,以便您可以存储它们并在以后使用它们。image_tag
如何知道如何表示您存储的数据?一旦弄明白,你可能想要分析一些关于如何实际实现它的选项:
一个。存储图像的二进制blob或base 64表示。在实际使用它之前,将其写入本地文件并将其作为image_tag的参数传递。缺点:非常低效。我把它作为一种选择,因为它是你首先尝试做的,但我不认为它是可行的。数据库未经过优化,无法在单个列条目中保存大量数据(因为它取决于数据库引擎和查询数据的方式)。此外,从DB /写入本地文件的读取速度非常慢,您需要尽可能快地提供该图像。
湾存储对文件的引用,并在本地保存图像(例如,可以放在app/assets/images
中)。然后,您可以使用image_tag Rails.root.join('app', 'assets', 'images', t.filename)
引用它。缺点:没有直接的方式知道您的图像可用。
℃。与CodeAcademy示例一样,将图像保存在外部服务中并保存对其的URL引用。有几种专门为此设计的服务,例如AWS S3。这些都是高度优化的,通常用于提供图像和文件,这就是为什么它比自己提供图像更好的原因。但是当你足够大,比如StackOverflow时,你可能想拥有自己的存储服务,因为密集使用可能比使用外部服务更好/更便宜。那么这些外部服务如何做到呢?可以将其直接存储到磁盘。然后当您访问该URL时,程序就像另一个文件一样提供该内容,但是放置必要的标题以便您的浏览器可以解释其内容(参见上面的概念1)。 修改:StackOverflow确实使用外部服务:imgur.com/gravatar.com,使用&#34; Inspect Element&#34;浏览器的工具,亲眼看看:)