ActiveStorage Overview --Rails guide (history:7-1更新)
- 如何attach一个或多个文件到一个记录.has_many_attach()方法。
- 如何删除一个附加的文件。 purge方法
- 如何连接到一个附加的文件。url_for()
- 如何使用variants来转化image。 ⚠️Variant/Variation模块
- 如何generate一个文件代表无图像的文件,如PDF,或者video。⚠️忽略了。
- 如何从浏览器发送一个文件上传到一个存储服务storage service, 通过你的应用服务 direct_upload: true方法,另外还增加了JavaScript event⚠️
- 在测试期间如何clear储存的文件⚠️我用的是参考书上的方法。
- 如何implement 支持 为额外的储存服务。⚠️还需要看帖子。
step by step 的网页,包括还未掌握的云存储,和服务器相关步骤:
https://afreshcup.com/home/2017/07/23/activestorage-samples
1.什么是ActiveStorage?
Active Storage上传文件到一个云存储服务如AmazonS3. 并且附加这件文件到Active Record objects。它基于本地磁盘服务,可以用于开发和测试以及支持镜像文件给次级服务用于备份和迁移。
使用Active Storage,一个程序可以转化文件通过ImageMagick上传。 以及生成文件代表无图像的文件,如PDF,或者video,以及提取元数据从任意文件。
2. Setup
ActiveStorage使用2个数据表储存文件。
运行rails active_storage:install 生成这2个数据表。
如果在本地开发,在config/environments/development.rb中,
config.active_storage.service = :local #默认已经设置了。
声明Active Storage 服务 在config/storage.yml中。 为了让你的程序使用云服务,需要提供一个名字和必须的配置。如amazon的配置:
本地和测试是默认的。
你需要告诉Active Storage使用那个server。设定:
Rails.application.config.active_storage.service
因为每个环境使用的服务不一样。所以推荐提前在环境中设置好。比如要在开发环境使用前面案例的disk 服务 , 你需要在config/environments/development.rb设置:
config.active_storage.service = :local #默认已经设置了。
如果在production中,使用AmazonS3服务,配置config/environments/production.rb:
config.active_storage.service = :amazon
当然还要读更多的信息关于内置服务适配器adapters(如Disk和S3)和它们需要的配置。
2.1Disk Service
声明 disk服务,在config/storage.yml中,默认已有了。
2.2 Amazon S3 Service
同样需要在config/storage.yml中设置。
另外需要下载他的gem:gem 'aws-sdk-s3', require: false
(主流的云服务都有gem)具体的都需要看相关文档。
其他Microsoft, Google(都需要下载gem)
2.5 Mirror Service
通过定义一个镜像服务,你可以持有多个云服务在异步下。
当一个文件上传或删除,它就通过了所以的镜像服务。
在产品环境中,镜像服务之间能够通过一个迁移来使用。
你开业开始镜像一个新的服务,拷贝现存的文件从旧服务到新服务,然后把所有的放在新服务上
Define each of the services you'd like to use as described above and reference them from a mirrored service.(不懂⚠️)
文件们从主服务被服务。
3 Attaching Files to Records
3.1 has_one_attached
可以参考https://www.cnblogs.com/chentianwei/p/9169049.html的写法:
在创建一个对象时,不添加关联。之后再使用:
@user.avatar.attach(params[:user][:avatar]) 来附加一个文件。
或者也可以通过参数限制方法user_params直接创建:
调用avatar.attached?可以确定对象是否有了一个文件,返回true/false
3.2 has_many_attached macro宏命令
一对多的关系。一条记录可以附加多个文件。假如有一个message有多个images:
has_many_attached :images, dependent:false #记录删除但附加文件不会删除。
⚠️,如果使用has_many, 注意传的是一个数组,
更新:(7-1)
在views/_form.html.slim中,用form_for:
就会在web, products/new中显示一个上传框:choose files,⚠️是files, 这样就可以上传多个文件了。✌️
全代码:
备注:product.avatar.variable? =>true; product.avatar.image? =>true;
图片既是image也是variable.
更新 7-2
假设@post有一个image
file_field(:image, accept: 'image/png,image/gif,image/jpeg')
:accept - If set to one or multiple mime-types, the user will be suggested a filter when choosing a file. You still need to set up model validations.
问题:如何设置validations。验证上传文件的格式。自定义?
使用“how to validate uploaded file type in rails 5.2”进行google search
- 得到2018年的搜索记录。看第一条。
- 看相关的网页:
https://github.com/rails/rails/issues/31656 (还没有看。)
在product.rb中
validate :must_type
avatar.purge
# 使用in?(%w(image/png image/jepg))也可以。
avatar.purge
#if images.attached? 后面的代码大同小异,多images一个循环。
在views/../_form.html.slim中添加file_field的时候,需要添加accept特性
= f.file_field :avatar, class:"form-control", accept: "image/jpg, image/jpeg, image/png, image/gif"
4 Removing Files
purge: 把文件从storage中清除。
可以从数据库直接删除:
ActiveStorage::Blob.find(
ActiveStorage Overview --Rails guide (history:7-1更新)的更多相关文章
- 转:Oculus Unity Development Guide开发指南(2015-7-21更新)
http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide ...
- An overview of gradient descent optimization algorithms (更新到Adam)
Momentum:解快了收敛速度,同时也减弱了SGD的波动 NAG: 减速了Momentum更新参数太快 Adagrad: 出现频率较低参数采用较大的更新,对于出现频率较高的参数采用较小的,不共用一个 ...
- Rails Guide -- Ruby on Rake(未详细阅读)
一个软件task管理和build 自动化的工具. 它允许用户指定tasks和describe dependencies, 也可以在一个namespace中group tasks. 使用Ruby语言写的 ...
- 基于TI Davinci架构的多核/双核开发高速扫盲(以OMAP L138为例),dm8168多核开发參考以及达芬奇系列资料user guide整理
基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门 原文转自http://blog.csdn.net/wangpengqi/article/details/8115614 感谢 ...
- Ionic 2 Guide
Ionic 2 Guide 最近一直没更新博客,业余时间都在翻译Ionic2的文档.之前本来是想写一个入门,后来觉得干脆把官方文档翻译一下算了,因为官方文档就是最好的入门教程.后来越翻译越觉得这个事情 ...
- Google C++ Style Guide在C++11普及后的变化
转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...
- iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch
本文为转载文章 故事背景: 这两天,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术 ...
- rails手脚架(scaffold)功能
scaffold是一个高速开发rails应用的代码框架.能够使用一条命令实现CRUD操作. 1: 创建一个应用 rails new scaffoldapp cd scaffoldapp rails s ...
- Rails 最佳实践
在你业务简单的时候,让你简简单单用 ActiveRecord 模型. 复杂的时候,你可以用官方推荐的 Concerns. 更复杂的时候,可以通过 gem 和 API 来拆分. 极端复杂的时候,由于 R ...
随机推荐
- 理解 php new static
今天在看 Laravel 的容器(Container)实现时,发现了这么一段突然不能理解的代码: ** * Set the globally available instance of the con ...
- 使用log4net做应用程序全局日志记录保存在数据库中
几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.经验表明,日志记录往往 ...
- Linux入门之常用命令(15) lsof
查看磁盘空间: [root@ticketb ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 981M 203M 729M ...
- redhat 6.6 离线安装docker
本机环境:redhat6.6 uname -a Linux host- -.el6.x86_64 # SMP Tue Sep :: EDT x86_64 x86_64 x86_64 GNU/Linux ...
- 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的
在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下 ...
- SSL/TSL握手过程详解
1. Client Hello 握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1.客户端支持的加密套件(Support Ciphe ...
- 如何确定Hadoop中map和reduce的个数--map和reduce数量之间的关系是什么?
一般情况下,在输入源是文件的时候,一个task的map数量由splitSize来决定的,那么splitSize是由以下几个来决定的 goalSize = totalSize / mapred.map. ...
- docker——libnetwork插件网络功能
从1.7.0版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来,允许用户通过指令来选择不同的后端实现.剥离出来的独立容器网络项目叫libnetwork,从名字就能看出,它希望将 ...
- TCP三次握手和四次挥手详解
背景描述通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交 ...
- CCF地铁修建
问题描述 A市有n个交通枢纽,其中1号和n号非常重要,为了加强运输能力,A市决定在1号到n号枢纽间修建一条地铁. 地铁由很多段隧道组成,每段隧道连接两个交通枢纽.经过勘探,有m段隧道作为候选,两个交通 ...