HeadFirst Ruby 第十五章总结 Saving and loading data
前言
在上一章讲述了如何进行基础的操作,比如 处理 GET 请求的 get route, 再比如下载 gem 等等方面的知识.
在这一章节,作者告诉我们如何储存、处理数据.
整个过程分三步走:
- 首先,当 user 提交了一个 form 之后, 我们需要 create 一个对应的 Movie 的 object.
- 然后,我们将 Ruby object 储存进一个格式为 .yml 的 file 中
- 当 user 点击一个 object 的 ID 之后,能够从 .yml 格式的 file 中得到一个新的 HTML 页面,进而获取详细信息.
1⃣️ create 一个对应的 Movie 的 object
第一步: Setting the HTML form to send a POST request
原理:两个 attribute
首先,我们需要确保 POST 请求是完整的,因此在 HTML 的 <form>
tag 里,需要两个 attribute:
- method:即 POST 这个 HTTP method
- action:即提交到所在资源库的 path
格式:
<form method="post" action="/movies/create">
第二步: Setting up a post route
原理:
处理 GET 请求的 Sinatra 的 route 名字叫 get, POST 请求的叫 post.
params 是伴随 post 方法的一个参数,这个参数是一个 hash, 它包含了 form data from the request.
格式:
post('/movies/create') do
"Received: #{params.inspect}"
end
✅过程三步走的第一步
首先,当 user 提交了一个 form 之后, 我们需要 create 一个对应的 Movie 的 object.
post('/movies/create') d0
@movie = Movie.new
@movie.title = params['title']
@movie.director = params['director']
@movie.year = params['year']
end
2⃣️ 将数据存储在 .yml 格式的 file 中
关于 YAML
YAML 定义:
YAML 不是标记语言,而是一个 standard for representing objects and other data.
YAML 功能:
- 用于将 object 的数据储存成为字符串格式
- 相逆的,用于将字符串格式的内容转变为 object
与 Ruby 的关系
Ruby 中的 'yaml' 模块可以将 Ruby 中的 objects 转换为 YAML 格式的 file 储存起来.
格式:
require 'yaml'
该模块可供调用的 method
- dump 用于将 object 转换为一个 string
- load 用于将一个 string 转换为 object
关于 YAML::Store
‘yaml' 仅仅可以进行转换,而无法将其内容储存为一个 file在 YAML library 中包含了 YAML::Store 这个 class, 它可以将 object 储存为 disk 中的 file.
格式
调用库:
require 'yaml/store'
读写:
store = YAML:Store.new('my_file.yml')
✅储存数据(过程三步走的第二步)
其格式与 hash 很相似,都需要一个 key 和一个响应的 value.
transaction是储存数据时需要执行的方法,用于 prevent other programs from writing to the file until the block exits.
store.transaction do
store["my key"] = "my value"
store["key two"] = "value two"
end
设置 object 的 ID
ID 是一个 object 的唯一标识,对于电影来说, 如果将 title 设为 ID, 那么就会产生一些缺陷:
- 由于有些电影 title 中存在”空格键“,因此在 URL 中不方便表示
- 可能存在 object 不同,但是两部电影的 title 相同的情况
因此, Numeric ID 是最佳选择.
设置步骤 & roots
- 在 Movie 这个 object 添加"id"这个属性.
- 在 lib 中添加 movie_store.rb ,编写一个 save 函数(其中用到 roots 这个属性)
roots: 一个 YAML:Store 的 instance 的属性,它能够将所有的 key 组合在一起,store 为一个 array.
代码如下:
class MovieStore
def initialize(file_name)
@store = YAML::Store.new(file_name)
end
def save(movie)
@store.transaction do
unless movie.id
highest_id = @store.roots.max || 0
movie.id = highest_id + 1
end
@store[movie.id] = movie
end
end
3⃣️ 将 .yml 中的字符串转变为 object
第一步: 取得 object 中的 values
使用 map 得到 .yml 中的 values
YAML::Store 的roots 方法返回的是各个 object 的 keys, 因此可以利用 map 这个 method 来得到其 values, map 的功能是:
- 将一个 array 中所有的元素都代入
- 返回一个新的 array, 它包含了 object 每个 key 对应的 value.
实现
- 在 moive_store.rb 中添加取得 values 的方法——all
def all
@store.transaction do
@store.roots.map {|id| @store[id]}
end
end - 在 app.rb 中,将 @movie 的相关内容改为 store.all
get('/movies') do
@movies = store.all
erb :index
end
第二步: Building HTML links to individual movies
parameter routes
格式:
get('/zipcode/:state')
功能:
Sinatra 中的用于 handle requests for multiple resources 的方法
需要注意:
其位置应该在所有 sinatra route 中 get, put 定义之后,因为如果在前面, 就会 override path 较短的 route
实现步骤
1 . 在 movie_store 中添加 find 方法
def find(id)
@store.transaction do
@store[id]
end
end
2 . 在 views 文件夹中新建展示详细内容的 show.erb
3 . 在 app.rb 中添加 get('movies/:id') ,导入页面 erb :show
✅最后框架
HeadFirst Ruby 第十五章总结 Saving and loading data的更多相关文章
- HeadFirst Ruby 第十四章总结 Web apps: Serving HTML
前言 这一章节主要讲了如何利用 Ruby 中的 Sinatra 这个 gem 来创建一个 Web app 的具体流程,其中的要点包括了: Sinatra, a third party library ...
- 15第十五章UDF用户自定义函数(转载)
15第十五章UDF用户自定义函数 待补上 原文链接 本文由豆约翰博客备份专家远程一键发布
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
- Gradle 1.12用户指南翻译——第四十五章. 应用程序插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Gradle 1.12 翻译——第十五章. 任务详述
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle 1.12用户指南翻译——第二十五章. Scala 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- Gradle 1.12用户指南翻译——第三十五章. Sonar 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- Java字节码浅析(—)
英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么.理解这点不仅能搞清语言特 ...
- 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...
- weblogic10以下,许可证过期解决办法
weblogic10以后的版本已经不再使用license.bea的方式来进行软件授权,之前的历史版本oracle提供了一个免费的许可证更新. 1.首先进入oracle的官网下载地址http://www ...
- Eclipse java项目将普通文件转化为Source文件的操作
前提:该项目中已经将原有的Source folder删除掉. 右键单击普通文件>Build path>Use as Source Folder.
- 一道cf水题再加两道紫薯题的感悟
. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...
- Python3 tkinter基础 Entry state 不可写 不可选 不可复制的输入框
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Flask学习【第5篇】:用Falsk实现的分页
Flask实现的分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): "" ...
- kubeadm 生成的token过期后,集群增加节点
通过kubeadm初始化后,都会提供node加入的token: You should now deploy a pod network to the cluster. Run "kubect ...
- Spyder 调出绘图界面
Tools->Preference->IPython console->Graphics->Graphics backend->QT4 or QT5
- 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)
裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...
前言 这一章节主要讲了如何利用 Ruby 中的 Sinatra 这个 gem 来创建一个 Web app 的具体流程,其中的要点包括了: Sinatra, a third party library ...
15第十五章UDF用户自定义函数 待补上 原文链接 本文由豆约翰博客备份专家远程一键发布
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么.理解这点不仅能搞清语言特 ...
汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...
weblogic10以后的版本已经不再使用license.bea的方式来进行软件授权,之前的历史版本oracle提供了一个免费的许可证更新. 1.首先进入oracle的官网下载地址http://www ...
前提:该项目中已经将原有的Source folder删除掉. 右键单击普通文件>Build path>Use as Source Folder.
. 遇到一个很大的数除以另一个数时,可以尝试把这个很大的数进行,素数因子分解. . 遇到多个数的乘积与另一个数的除法时,求是否能整除,可以先求每一个数与分母的最大公约数,最后若分母数字为1,则证明可整 ...
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
Flask实现的分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): "" ...
通过kubeadm初始化后,都会提供node加入的token: You should now deploy a pod network to the cluster. Run "kubect ...
Tools->Preference->IPython console->Graphics->Graphics backend->QT4 or QT5
裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...