公共形象
如果您引用公共文件夹中的图像,请将图像的根相对路径存储为string
在数据库中。 (例如,如果您的图像文件是project/public/images/pic.jpg
,那么你就会有image: '/images/pic.jpg'
在种子中。
资产管理图像
如果您在资产中引用图像,事情可能会变得更加复杂(除非您不明智地关闭了config.assets.digest
配置)。您需要使用种子文件中资源的路径(就像本答案的第一部分引用公共文件夹中的文件一样),但是当您想要链接到视图中的图像时,您必须使用 Rails 的image_tag
获取图像的资产管理 url。
如果由于某种原因您希望能够以除image_tag
在视图中,它变得有点复杂。您可以在官方文档中找到有关使用资产管道的更多详细信息Rails 资产管道指南 http://guides.rubyonrails.org/asset_pipeline.html.
图像存储在数据库中
如果要将图像文件数据存储在数据库中,则可以使用binary
字段(不string
)。您可以通过调用加载图像数据File.read
. E.g.:
image_data = File.read('path/to/image.jpg')
Model.create!([
{
...
image: image_data
},
...
])
您需要添加自定义控制器方法和路由,以将图像数据作为文件传递给客户端(确保正确处理 mime 类型)。
就个人而言,在我选择将原始文件数据存储在数据库中的情况下,我更喜欢为数据创建一个单独的表,然后根据需要将其连接到主模型。 (在这种情况下,您现有的images
表,它将连接到一个名为类似的表image_files
只有一个字段,除了id
):
create_table :image_files do |t|
t.binary :data
end
然后你可以从你的images
table:
t.belongs_to :image_file
(或者将引用放在images
表中的image_files
table.)
至于支持/反对在数据库中存储原始文件数据的争论,一般来说它不是最佳的(你失去了让 Web 服务器直接从文件系统发送文件的好处,并且必须让 Rails 介入)。但在某些情况下(例如当您想要限制访问权限时,例如特定用户),它可能是有意义的。