如何使用资产管道(回形针)中的图像为 Rails 数据库播种?

2023-12-25

我正在尝试为客户重构我的 Rails 应用程序。

我创建了一个包含相关列的新模型(title, description, body).

我需要添加image到这个模型,但我不知道要使用什么数据类型,而且我读到将图像放入数据库是一个坏主意。

目前,我正在尝试使用来自客户端的所有数据为数据库播种,并努力寻找一种在图像中播种的方法。到目前为止我有以下内容:

Model.create!([
  {
    title: "Title",
    description: "Some decription",
    body: "Here is the body",
    sort_order: 1 
  },
  { 
    title: "Title",
    description: "Some description",
    body: "Here is the body",
    sort_order: 2
  }
])

我应该添加image到模型,以便我可以使用种子文件填充它?如果是这样,数据类型是什么 - 也许string?


公共形象

如果您引用公共文件夹中的图像,请将图像的根相对路径存储为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 介入)。但在某些情况下(例如当您想要限制访问权限时,例如特定用户),它可能是有意义的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用资产管道(回形针)中的图像为 Rails 数据库播种? 的相关文章

随机推荐