Shrine项目Entity插件详解:处理不可变结构体附件
shrine File Attachment toolkit for Ruby applications 项目地址: https://gitcode.com/gh_mirrors/shr/shrine
什么是Shrine的Entity插件
Shrine的Entity插件是一个专门用于在不可变结构体(immutable structs)上处理文件附件的扩展模块。它构建在column插件基础之上,为开发者提供了一套简洁的API来处理文件上传和关联。
核心功能与使用方式
要启用Entity插件,只需在Shrine配置中添加:
plugin :entity
Attachment模块详解
通过在实体类中包含Shrine::Attachment
模块,可以为该类添加以下实例方法:
#<name>
- 返回已附加的文件对象#<name>_url
- 返回已附加文件的URL#<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 ...>
关键操作
- 加载实体:使用
Attacher.from_entity
创建由实体对象支持的Attacher
实例 - 重新加载:
Attacher#reload
方法从实体属性重新加载附加文件 - 列值获取:
Attacher#column_values
返回包含实体属性和当前附件数据的哈希 - 实体数据访问:通过
Attacher#record
和Attacher#name
访问相关实体信息
最佳实践
- 对于简单的用例,直接使用
Shrine::Attachment
模块最为方便 - 需要更精细控制时,可以直接操作
Attacher
实例 - 考虑为不同的存储需求配置不同的
Attacher
选项 - 注意处理附件数据为空的情况,确保代码健壮性
通过合理使用Entity插件,开发者可以在不可变结构体中优雅地处理文件附件,同时保持代码的清晰和可维护性。
shrine File Attachment toolkit for Ruby applications 项目地址: https://gitcode.com/gh_mirrors/shr/shrine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考