Shrine项目Entity插件详解:处理不可变结构体附件

Shrine项目Entity插件详解:处理不可变结构体附件

shrine File Attachment toolkit for Ruby applications shrine 项目地址: https://gitcode.com/gh_mirrors/shr/shrine

什么是Shrine的Entity插件

Shrine的Entity插件是一个专门用于在不可变结构体(immutable structs)上处理文件附件的扩展模块。它构建在column插件基础之上,为开发者提供了一套简洁的API来处理文件上传和关联。

核心功能与使用方式

要启用Entity插件,只需在Shrine配置中添加:

plugin :entity

Attachment模块详解

通过在实体类中包含Shrine::Attachment模块,可以为该类添加以下实例方法:

  1. #<name> - 返回已附加的文件对象
  2. #<name>_url - 返回已附加文件的URL
  3. #<name>_attacher - 返回Shrine::Attacher实例

这些方法会从实体实例的#<name>_data属性中读取附件数据。

基本使用示例

class Photo
  attr_reader :image_data

  include ImageUploader::Attachment(:image)
end
photo = Photo.new(image_data: '{"id":"...","storage":"...","metadata":{...}}')
photo.image          # 返回UploadedFile对象
photo.image_url      # 返回文件URL
photo.image_attacher # 返回Attacher实例

方法详细说明

#<name>方法

调用Attacher#get,返回从附件数据实例化的UploadedFile对象。

photo = Photo.new(image_data: '{"id":"foo.jpg","storage":"store","metadata":{...}}')
photo.image             #=> #<ImageUploader::UploadedFile>
photo.image.id          #=> "foo.jpg"
photo.image.storage_key #=> :store
photo.image.metadata    #=> { ... }

如果没有附加文件,则返回nil

#<name>_url方法

调用Attacher#url,返回附加文件的URL。

photo = Photo.new(image_data: {"id":"foo.jpg","storage":"...","metadata":{...}})
photo.image_url #=> "https://example.com/foo.jpg"

如果没有附加文件,则返回nil

#<name>_attacher方法

调用Attacher.from_entity,返回一个由实体对象支持的Attacher实例。

photo = Photo.new
photo.image_attacher           #=> #<ImageUploader::Attacher>
photo.image_attacher.record    #=> #<Photo>
photo.image_attacher.name      #=> :image
photo.image_attacher.attribute #=> :image_data

Attacher直接使用

即使不使用Shrine::Attachment模块,也可以直接使用Shrine::Attacher

class Photo
  attr_reader :image_data
end
photo = Photo.new(image_data: '{"id":"...","storage":"...","metadata":{...}}')
attacher = ImageUploader::Attacher.from_entity(photo, :image)

attacher.file #=> #<Shrine::UploadedFile id="bc2e13.jpg" storage=:store ...>

关键操作

  1. 加载实体:使用Attacher.from_entity创建由实体对象支持的Attacher实例
  2. 重新加载Attacher#reload方法从实体属性重新加载附加文件
  3. 列值获取Attacher#column_values返回包含实体属性和当前附件数据的哈希
  4. 实体数据访问:通过Attacher#recordAttacher#name访问相关实体信息

最佳实践

  1. 对于简单的用例,直接使用Shrine::Attachment模块最为方便
  2. 需要更精细控制时,可以直接操作Attacher实例
  3. 考虑为不同的存储需求配置不同的Attacher选项
  4. 注意处理附件数据为空的情况,确保代码健壮性

通过合理使用Entity插件,开发者可以在不可变结构体中优雅地处理文件附件,同时保持代码的清晰和可维护性。

shrine File Attachment toolkit for Ruby applications shrine 项目地址: https://gitcode.com/gh_mirrors/shr/shrine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董洲锴Blackbird

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值