Ruby

Day 18:Rails 应用的测试

准备一个全新的 Rails 应用,今天我们了解一下 Rails 应用的测试。

创建测试

先为我们要创建的控制器创建一个测试,比如我要创建一个名字是 Pages 的控制器,对这个控制器的测试可以放在 test/controllers 目录的下面,创建一个测试文件,文件名里可以包含控制器的名字,再加上一个 test 后缀:

test/controllers/pages_controller_test.rb

在这个测试文件里,先 require 测试需要的一个助手,名字是 test_helper。每个测试都是一个类,让它继承 ActionDispatch::IntegrationTest。在这个测试文件里添加:

require 'test_helper'

class PagesControllerTest <  ActionDispatch::IntegrationTest
end

Day 17:两步创建一个简单的 Rails 应用

今天做点试验,先准备一个全新安装的 Rails 应用。

用户资源

生成一个 User 资源,给它添加一个 name  还有 email,存储用户的名字与电子邮件地址。

rails generate scaffold User name:string email:string

migrate 一下,会在数据库里创建 users 数据表,表里会有 name 与 email 字段。

rails db:migrate

现在你就可以在浏览器上管理用户了。
57c4574d-6bb9-42ef-92a5-0d5a1e12d3bd

Day 16:Rails Active Record Migration

宁皓网的付费会员可以查看课程:《Rails:数据库 Migration》http://ninghao.net/course/4133

创建 Migration

使用命令行:

rails generate migration 名字

简写:

rails g migration 名字

migration 的名字要描述清楚它的作用,使用驼峰式的名字,创建的 migration 会包含一个时间,它会作为数据库的版本,Rails 也会用这个时间来判断哪些是执行过的 migration 。执行的 migration 会记录在数据库里。

现在我要创建一个 migration,可以帮助我们在数据库里创建一个数据表:

rails generate migration CreateArticles

返回的东西像这样:

Day 15:Rails 基础

宁皓网的付费会员可以查看课程:《Ruby on Rails:起步》http://ninghao.net/course/4101

resource ,资源。一个资源就是一种相似对象的集合,比如文章,用户。你可以对资源执行创建,读取,更新,删除的动作,这些动作被称为 CRUD 操作。

一个博客,里面可能会有文章资源。创建一个文章资源,名字是 articles,先添加一个资源类型的路由。编辑 config/routes.rb,添加一行 resources :articles,像这样:

Rails.application.routes.draw do
  resources :articles
  # ...
end

执行:

rails routes

返回:

Day 14:“Hello” Ruby on Rails

学习与开发 Ruby on Rails 应用的过程是在本地电脑上完成的。也就是你需要在本地电脑上创建 Rails 项目,运行它,然后学习或去做真正的开发。两种方法,一是可以直接在本地电脑上安装 Rails 项目的所有工具,然后直接在本地电脑上运行 Rails 项目。另外, 我们可以使用 Docker 去 Compose 一个 Rails 项目。

在本地直接运行 Rails 项目

需求

我在 macOS 上测试了整个过程。你需要:

  1. 安装 Ruby
  2. 安装 Xcode

安装 rails

打开终端,用 Ruby 的 Gem 去安装 Rails:

gem install rails

这会安装最新的 rails。你也可以指定安装具体的 Rails 版本,像这样:

gem install rails -v 5.0.0.1

如果你遇到错误:

Day 13:Ruby 匿名函数

Ruby 里面主要的可调用的对象是 Proc 对象,Lambdas,方法对象。Proc 是独立的代码序列,你可以创建,存储,可以作为方法的参数,你愿意的话,也可以使用 call 方法执行它。Lambdas 跟 Proc 对象很像,Lambda 其实就是 Proc 对象,不过稍有不同。

Proc 对象

用 Proc.new 创建一个 Proc 实例:

pr = Proc.new { puts "inside a proc's block" }

上面的代码块就是 Proc 的主体,调用 Proc 的时候会执行代码块里的东西:

pr.call

结果是:

inside a proc's block

给 proc 方法一个代码块,它会给你返回一个 Proc 对象。

proc { puts "hi!" }

Procs 与 Blocks

不是所有的代码块都跟 Proc 一样。

[1,2,3].each {|x| puts x * 10 }

上面用了个代码块,但是并没有创建一个 proc。

一个方法可以捕获一个代码块:

Day 12:Ruby 文件 I/O 操作

Ruby 对待文件与 I/O 操作也是面向对象的。

Ruby 的 I/O 系统

IO 类处理所有的输入与输出流。

IO 类

IO 对象表示可读可写的到磁盘文件,键盘,屏幕或设备的连接。

程序启动以后会自动设置 STDERR,STDIN,STDOUT 这些常量。STD 表示 Standard,ERR 是 Error,IN 是 Input,OUT 是 Output。

标准的输入,输出,还有错误流都封装到了 IO 的实例里面。做个实验:

>> STDERR.class
=> IO
>> STDERR.puts("problem!")
problem!
=> nil
>> STDERR.write("problem!\n")
problem!
=> 9

STDERR 是一个 IO 对象。如果一个 IO 对象开放写入,你可以在它上面调用 puts,你想 puts 的东西会写入到 IO 对象的输出流里。IO 对象还有 print 与 write 方法。 write 到 IO 对象的东西不会自动添加换行符,返回的值是写入的字节数。

Day 11:Ruby 正则表达式

Ruby 正则表达式的字面构造器:

//

试一下:

>> //.class
=> Regexp

模式匹配有两个部分组成,一个正则表达式(regexp),还有一个字符串。正则表达式预测字符串,字符串要么满足预测,要么不满足。

看看是不是匹配可以使用 match 方法。做个实验:

>> puts "匹配!" if /abc/.match("the alphabet starts with abc.")
匹配!
=> nil
>> puts "匹配!" if "the alphabet starts with abc.".match(/abc/)
匹配!
=> nil

除了 match 方法,还有个模式匹配操作符 =~ ,把它放在字符串与正则表达式的中间用:

Day 10:Ruby 枚举

想要枚举的 Class 就得有一个 each 方法,它的工作就是 yield 项目给代码块,每次一个。

each 做的事在不同的类上可能不太一样,比如在数组上,each 会 yield 第一个项目,然后是第二个,第三个 ...  在 hash 里,yield 的是 key/value 作为两个元素的数组。在 file 处理上,每次会 yield 一行内容。range 迭代会先看一下有没有可能迭代,然后假装它是一个数组。在自己的类里定义了 each 方法,它的意思是你自己定义的,只要它 yield 点东西就行。

先写个类,理解一下 Enumerable 是怎么回事。Rainbow 彩虹,每次 yield 一种颜色:

class Rainbow
  include Enumerable

  def each
    yield 'red'
    yield 'orange'
    yield 'yellow'
    yield 'green'
    yield 'blue'
    yield 'indigo'
    yield 'violet'
  end
end

Day 9:Ruby 集合与容器对象

数组(array),散列(hash)。array 里的项目有顺序,你可以用索引号得到对应的项目。hash 里的项目是成对的,一对里有个 key 还有个对应的 value。得到项目的 value 可以使用项目的 key 。

任何的 Ruby 对象都可以作为 hash 的 key 或者 value ,不过注意 key 在 hash 里一定是唯一的。hash 在其它的语言上也叫 dictionaries 或者 associative arrays  。

array 与 hash 很像。在某种意义上 array 就是 hash,只不过它的 key 是连续的整数。hash 有某种意义上也是 array,只不过索引可以是任何东西。

做个实验:

array = ["ruby", "diamond", "emerald"]
hash = { 0 => "ruby", 1 => "diamond", 2 => "emerald" }
puts array[0] # ruby
puts hash[0] # ruby

再做个实验:

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点