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多 ...
随机推荐
- Auth组件,Forms组件
一.Auth组件默认auth_user表常用操作 #1.配置settings,使django与数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db ...
- 做了一道cf水题
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
- Window 对象 HTML框架标签(Frame)
Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外 ...
- Python3 tkinter基础 Frame bind 敲击键盘事件 将按键打印到console中
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】
1.规划好哪些服务运行在那个服务器上 需要配置的配置文件 2. 修改配置文件,设置服务运行机器节点 首先在 hadoop-senior 的这台主机上 进行 解压 hadoop2.5 按照 ...
- Docker1之Container
Document An image is a lightweight, stand-alone, executable package that includes everything needed ...
- Nuget CsvHelper 的使用
CsvHelper:nuget地址 csv导出类||生成类 public class CSVHeader { public string head1 { get; set; } public stri ...
- Jquery Validate 相关参数
Jquery Validate 相关参数 //定义中文消息 var cnmsg = { required: “必选字段”, remote: “请修正该字段”, email: “请输入正确格式的电子邮件 ...
- Autofac创建实例的方法总结
1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 2.InstancePerLifetimeScope 在一个生命周期域中, ...
- BZOJ 1070: [SCOI2007]修车(费用流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...
前言 这一章节主要讲了如何利用 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多 ...
一.Auth组件默认auth_user表常用操作 #1.配置settings,使django与数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db ...
被一道cf水题卡了半天的时间,主要原因时自己不熟悉c++stl库的函数,本来一个可以用库解决的问题,我用c语言模拟了那个函数半天,结果还超时了. 题意大概就是,给定n个数,查询k次,每次查询过后,输出 ...
Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外 ...
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
1.规划好哪些服务运行在那个服务器上 需要配置的配置文件 2. 修改配置文件,设置服务运行机器节点 首先在 hadoop-senior 的这台主机上 进行 解压 hadoop2.5 按照 ...
Document An image is a lightweight, stand-alone, executable package that includes everything needed ...
CsvHelper:nuget地址 csv导出类||生成类 public class CSVHeader { public string head1 { get; set; } public stri ...
Jquery Validate 相关参数 //定义中文消息 var cnmsg = { required: “必选字段”, remote: “请修正该字段”, email: “请输入正确格式的电子邮件 ...
1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 2.InstancePerLifetimeScope 在一个生命周期域中, ...
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意: 思路: 神奇的构图. 因为排在后面的人需要等待前面的车修好,这里将每个技术人员拆成n个 ...