Codecademy显示可以通过url (in seeds.rb):
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 %>
我怎样才能做到这一点?
你必须首先掌握一些概念:
- 不能存储
File.open
或File.new
返回的对象。它们只是引用流的IO对象(这里有更多信息)。至少你需要用File.read
获取图像的内容,以便你可以存储它们并稍后使用它们。 一旦你在一个变量中有了图像的内容,你可以将它存储在你的数据库中。注意,这是一个很大的元素,你可能需要扩展你的存储。 - 让我们假设您可以从数据库中检索此内容。
image_tag
应该如何知道如何表示您存储的数据?
一旦你弄清楚了这一点,你可能想要分析一些如何实际实现它的选项:
。存储图像的二进制blob或64进制表示。在实际使用它之前,将其写入本地文件并将其作为image_tag的参数传递。缺点:效率很低。我把它作为一种选择,因为这是你首先要做的事情,但我认为这是不可行的。数据库没有被优化为在单个列条目中保存大量数据(对此持保留态度,因为这取决于DB引擎和查询数据的方式)。此外,从DB读取/写入本地文件相当慢,您需要尽可能快地提供该映像。
b。存储对该文件的引用,并将图像保存在本地(例如,可以放在app/assets/images
中)。然后你可以用image_tag Rails.root.join('app', 'assets', 'images', t.filename)
来引用它。缺点:没有直接的方法知道你的图像是可用的。
c。与CodeAcademy示例中一样,将图像保存在外部服务中,并保存对其的URL引用。有几个服务是专门为此设计的,比如AWS S3。这些都是高度优化的图像和文件的服务,这就是为什么它比自己服务的图像更好。但是当你足够大的时候,比如说,StackOverflow,你可能想要拥有自己的存储服务,因为密集使用可能比使用外部服务更好/更便宜。那么这些外部服务是如何做到的呢?它可以直接存储到磁盘上。然后,当您访问该url时,程序会像提供另一个文件一样提供该内容,但会添加必要的头,以便浏览器可以解释其内容(参见概念1)。如上图所示)。编辑: StackOverflow使用外部服务:imgur.com/gravatar.com,使用浏览器的"检查元素"工具,自己看看:)
快速回答:
User.first.image.attach(io: File.open("db/seeds-images/me.jpg"), filename: "me.jpg")
指出:
我喜欢把一些图像直接放在db/seeds-images中,但是你可以把它们放在你喜欢的任何地方。
答案基于这里