ActiveStorage. 英文书Learnrails5.2的案例,看如何放到云上。
本例子目标:增加一个avatar image给每个用户。
准备:
需要安装Imagemagick software。它可以create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats 。
可以使用打包管理软件homebrew安装brew install imagemagick。
在Rails,需要使用gem 'mini_magick' 。通过这个gem来使用Imagemagic的功能。
⚠️,我使用80template的时候,没有用这个gem,也能正常使用。
开始:
安装ative_storage: rails active_storage:install
提示从active_storage迁移:
解释:
t.index [:key], unique:true使用了index()方法,其内部使用了@base.add_index()方法,这个方法会生成sql语句,和数据库交互:
CREATE UNIQUE INDEX active_storage_blobs_key_index ON active_storage_blobs(key)
index的名字是表名+列名+_index后缀,太长的话,可以使用便名:add_index(name:"")
解释:
t.references :blob使用了关联方法add_references()方法,选项null:false是不得为空。
还有:type, :foreign_key, :index等方法。
type默认是digint长整数。
foreign_key:true用于本列被设置为关联外键。
index:true调用add_index方法给这个列增加索引。
新增的两个数据表会储存所有信息。user表无需增加一个额外的列,只需在User model中建立一个关联使用ActiveStorage::Attached#Marcos#has_one_attached 宏方法。
这里has_one_attached :avatar
然后就可以使用avatar方法了
解释:
Macros是宏命令的简写 Macroinstruction。
除此之前还has_many_attached(), 这里ActiveStorage会自动映射recoreds和the attachments。其实这个方法内部使用了has_many关联了attachments,使用了has_many-through关联了bolbs。
在控制台建立一个user,然后:
> user.avatar.attach(io: File.open("/Users/chentianwei/Desktop/1.jpeg"), filename: "1.jpeg", content_type: "image/jpeg")
#attach()方法可以用参数params[:avatar]或者ActiveStorage::blob object
解释:
- 首先从Attachment中找到关联的user.
- 文件信息上传,并自动生成一个key
- 把文件插入到Blob数据表中。包括文件名,类型,大小,key等信息。
- 如果1中没有现存的记录,此时在Attachment中建立记录,关联上user以及blob。
- user的updated_at属性更新。
可以使用user.avator.attached? 检测是否成功,返回true.
在views/users/show.html.erb增加这个图像。
在控制器端修改create和update:例子:
在_form.html.erb中增加图片的上传操作:
<div>
<%= form.label :avatar %>
<%= form.file_field :avatar %>
</div>
增加了一个功能测试:测试文件上传是否成功:
attach_file("Avatar", "#{Rails.root}/spec/files/1.jpeg")
还要在spec_helper中设置删除测试数据库中的文件具体见:
https://www.cnblogs.com/chentianwei/p/9071330.html
以上是基础,Active Storage还也可resize图片尺寸,可以把图片保存在云端的。具体看指导,和ruby-china的帖子。
可能先需要云服务器的知识,以及部署产品环境。
ActiveStorage. 英文书Learnrails5.2的案例,看如何放到云上。的更多相关文章
- 沉淀,再出发:结合案例看python
沉淀,再出发:结合案例看python 一.前言 关于python,如果不经过大型程序开发的洗礼,我们很难说自己已经懂得了python了,因此,我们需要通过稍微结构化的编程来学习python. 二.一个 ...
- nigin配置安全:三个案例看Nginx配置安全(转)
转:https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html 三个案例看Nginx配置安全 PHITHON 之 ...
- 阿里云96页报告详解《云上转型》(10个案例、10大趋势/完整版PPT)
阿里云96页报告详解<云上转型>(10个案例.10大趋势/完整版PPT) 2017-12-29 14:20阿里云/云计算/技术 ﹃产业前沿超级干货﹄ ﹃数据观○重磅速递﹄ 阿里云研究中心云 ...
- Java 8新的时间日期库,这二十个案例看完你还学不会算我的!!!
Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及 ...
- Mybatis案例超详解(上)
Mybatis案例超详解(上) 前言: 本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟 ...
- 从Windows角度看Mac OS X上的软件开发
如果原来从事Windows软件开发,想跨足或转换至Mac OS X环境,需要知道那些东西?有什么知识技能可以快速运用在Mac OS X环境上的?这两个问题应该是Windows开发者进入Mac OS X ...
- Oracle案例02——ORA-12034: "SCOTT"."USER_TABLE" 上的实体化视图日志比上次刷新后的内容新
最近同事在交接工作时,发现有几个schedule job没有执行成功,我这边给看了下,其中一个是由于数据库迁移,调用dblink的host主机IP在tnsnames中没有变更导致,还有一个是无法视图的 ...
- 许式伟看 Facebook 发币(上): 区块链, 比特币与 Libra 币
你好,我是七牛云许式伟. Facebook(脸书)于6月18日发布了其加密数字货币项目白皮书.该数字货币被命名为 Libra(天秤座),象征着平衡与公正.此前,BBC 报道说这个数字货币叫 Globa ...
- 《一张图看懂华为云BigData Pro鲲鹏大数据解决方案》
8月27日,华为云重磅发布了业界首个鲲鹏大数据解决方案--BigData Pro.该方案采用基于公有云的存储与计算分离架构,以可无限弹性扩容的鲲鹏算力作为计算资源,以支持原生多协议的OBS对象存储服务 ...
随机推荐
- Redis的简单了解以及主从复制
1.Redis的简单了解 Redis是一种高性能的分布式NoSql数据库,持久存储,高并发,数据类型丰富,通过现场申请内存空间,同时可以配置虚拟内存.五种数据类型:string(字符串,这种格式和me ...
- 奔小康赚大钱---hdu2255(最大带权匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 带权匹配问题的模板: 运用KM算法: #include<stdio.h> #incl ...
- 傅里叶变换 VS 拉普拉斯变换
拉普拉斯变换的公式 傅里叶变换公式 拉普拉斯变换是将时域映射到s plane上,而傅里叶变换实际是将时域 映射在s-plane的虚轴上, 傅里叶变换可以看作拉普拉斯变换 的一种特例 1.推导傅里叶变 ...
- (转)《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的!
上篇我们引入了SSO这个话题<15分钟了解SSO是个什么鬼!>.本篇我们一步步深入分析SSO实现机理,并亲自动手实现一个线上可用的SSO认证服务器!首先,我们来分析下单Web应用系统登录登 ...
- java多线程(六)
使用Runnable接口创建线程 Runnable接口 只有一个run()方法 Thread类实现了Runable接口 便于多个线程共享资源 Java不支持多继承,如果已经继承了某个基类,便要实现Ru ...
- 20154312曾林 - Exp1 PC平台逆向破解
1.逆向及Bof基础实践说明 1.1-实践目标 对象:pwn1(linux可执行文件) 目标:使程序执行另一个代码片段:getshell 内容: 手工修改可执行文件,改变程序执行流程,直接跳转到get ...
- Python numpy 安装以及处理报错 is not a supported wheel on this platform
1. 安装 1)去这里搜索https://pypi.org/ 2)搜索框输入numpy 3)一般第一个就是搜索到的 4)点进去 5) Download files 点进去,找自己的版本 6)nu ...
- Python笔记 #15# Pandas: Missing Data
10 Minutes to pandas import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ...
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
首先,我们先写一个简单的C语言程序,如下: int g(int x) { return x +3; } int f(int x) { return g(x); } int main(void) { r ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...