HeadFirst Ruby 第十五章总结 Saving and loading data

前言

在上一章讲述了如何进行基础的操作,比如 处理 GET 请求的 get route, 再比如下载 gem 等等方面的知识.
在这一章节,作者告诉我们如何储存、处理数据.
整个过程分三步走:

  1. 首先,当 user 提交了一个 form 之后, 我们需要 create 一个对应的 Movie 的 object.
  2. 然后,我们将 Ruby object 储存进一个格式为 .yml 的 file 中
  3. 当 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:

  1. method:即 POST 这个 HTTP method
  2. 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 功能:

  1. 用于将 object 的数据储存成为字符串格式
  2. 相逆的,用于将字符串格式的内容转变为 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, 那么就会产生一些缺陷:

  1. 由于有些电影 title 中存在”空格键“,因此在 URL 中不方便表示
  2. 可能存在 object 不同,但是两部电影的 title 相同的情况

因此, Numeric ID 是最佳选择.

设置步骤 & roots

  1. 在 Movie 这个 object 添加"id"这个属性.
  2. 在 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 的功能是:

  1. 将一个 array 中所有的元素都代入
  2. 返回一个新的 array, 它包含了 object 每个 key 对应的 value.

实现

    1. 在 moive_store.rb 中添加取得 values 的方法——all  def all
      @store.transaction do
      @store.roots.map {|id| @store[id]}
      end
      end 
    2. 在 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

 

✅最后框架

?主文件夹内

app.rb

  1. 创建 .yml 文件, store = MovieStore.new('movies.yml')
  2. 响应各种 HTTP 请求的 method: 其中包括两个部分,一部分用于添加数据:get('movies/new'), post('movies/create'), 第二部分用于得到各个电影详细的界面get('\movies'),get('/movies/:id')

movies.yml

这个文件包含了 MovieStore 这个 class 所有创建的 object 的数据

?lib 文件夹内

lib/movie.rb

为 Movie 这个 class 的 object 定义相关属性

lib/movie_store.rb

为 Movie 的 object 定义一些设置ID、读取 ID 对应的 value 、查找 ID 对应的 object 的方法.

?views 文件夹内

views/show.erb

显示所有电影的 title

views/index.erb

显示每一部电影具体的细节

views/new.erb

显示 form 表格,并且设置 form 要 POST 到的 path.





转载于:https://www.cnblogs.com/FBsharl/p/10644294.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值