# 5.4 用户注册:第一步
为了完成本章的目标,本节要设置“注册”页面的路由,为此要创建第二个控制器。这是允许用户注册重要的第一步,我们会在[第 6 章](chapter6.html#modeling-users)完成第二步,创建用户模型,[第 7 章](chapter7.html#sign-up)会完成整个功能。
## 5.4.1 用户控制器
我们在 [3.2 节](chapter3.html#static-pages)创建了第一个控制器——静态页面控制器。现在要创建第二个,用户控制器。和之前一样,我们使用 `generate` 命令创建所需的控制器骨架,包含用户注册页面所需的动作。遵照 Rails 使用的 REST 架构约定,我们把这个动作命名为 `new`,把 `new` 作为参数传给 `generate` 命令就可以自动创建这个动作,如[代码清单 5.28](#listing-generate-users-controller) 所示。
##### 代码清单 5.28:生成用户控制器(包含 `new` 动作)
```
$ rails generate controller Users new
create app/controllers/users_controller.rb
route get 'users/new'
invoke erb
create app/views/users
create app/views/users/new.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
create test/helpers/users_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/users.js.coffee
invoke scss
create app/assets/stylesheets/users.css.scss
```
上述命令会创建用户控制器,以及其中的 `new` 动作([代码清单 5.30](#listing-initial-users-controller))和一个占位视图([代码清单 5.31](#listing-initial-new-action))。除此之外还会为新建用户页面生成一个简单的测试([代码清单 5.32](#listing-user-new-test)),这个测试现在可以通过:
##### 代码清单 5.29:**GREEN**
```
$ bundle exec rake test
```
##### 代码清单 5.30:默认生成的用户控制器,包含 `new` 动作
app/controllers/users_controller.rb
```
class UsersController < ApplicationController
def new
end
end
```
##### 代码清单 5.31:默认生成的 `new` 动作视图
app/views/users/new.html.erb
```
<h1>Users#new</h1>
<p>Find me in app/views/users/new.html.erb</p>
```
##### 代码清单 5.32:新建用户页面的测试 GREEN
test/controllers/users_controller_test.rb
```
require 'test_helper'
class UsersControllerTest < ActionController::TestCase
test "should get new" do
get :new
assert_response :success
end
end
```
## 5.4.2 “注册”页面的 URL
有了前一节生成的代码,现在就可以通过 /users/new 访问新建用户页面。但是参照[表 5.1](#table-url-mapping),我们希望这个页面的 URL 是 `/signup`。为此,我们要参照[代码清单 5.22](#listing-static-page-routes) 的做法,为“注册”页面添加规则 `get '/signup'`,如[代码清单 5.33](#listing-signup-route) 所示。
##### 代码清单 5.33:“注册”页面的路由
config/routes.rb
```
Rails.application.routes.draw do
root 'static_pages#home'
get 'help' => 'static_pages#help'
get 'about' => 'static_pages#about'
get 'contact' => 'static_pages#contact'
get 'signup' => 'users#new' end
```
然后使用具名路由让首页中的按钮指向正确的地址。和其他路由一样,添加 `get 'signup'` 后会得到具名路由 `signup_path`。我们在[代码清单 5.34](#listing-home-page-signup-link) 中使用这个具名路由。针对“注册”页面的测试留作[5.6 节](#filling-in-the-layout-exercises)。
##### 代码清单 5.34:使用按钮链接到“注册”页面
app/views/static_pages/home.html.erb
```
<div class="center jumbotron">
<h1>Welcome to the Sample App</h1>
<h2>
This is the home page for the
<a href="http://www.railstutorial.org/">Ruby on Rails Tutorial</a>
sample application.
</h2>
<%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %> </div>
<%= link_to image_tag("rails.png", alt: "Rails logo"),
'http://rubyonrails.org/' %>
```
最后,编写“注册”页面的临时视图,如[代码清单 5.35](#listing-initial-signup-page) 所示。
##### 代码清单 5.35:“注册”页面的临时视图
app/views/users/new.html.erb
```
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<p>This will be a signup page for new users.</p>
```
现在,我们暂别链接和具名路由,到[第 8 章](chapter8.html#log-in-log-out)再添加“登录”页面的路由。新创建的用户注册页面如[图 5.9](#fig-new-signup-page) 所示。
![new signup page 3rd edition](https://box.kancloud.cn/2016-05-11_5732bd05dca6b.png)图 5.9:[/signup](http://localhost:3000/signup) 地址上的“注册”页面
- Ruby on Rails 教程
- 致中国读者
- 序
- 致谢
- 作者译者简介
- 版权和代码授权协议
- 第 1 章 从零开始,完成一次部署
- 1.1 简介
- 1.2 搭建环境
- 1.3 第一个应用
- 1.4 使用 Git 做版本控制
- 1.5 部署
- 1.6 小结
- 1.7 练习
- 第 2 章 玩具应用
- 2.1 规划应用
- 2.2 用户资源
- 2.3 微博资源
- 2.4 小结
- 2.5 练习
- 第 3 章 基本静态的页面
- 3.1 创建演示应用
- 3.2 静态页面
- 3.3 开始测试
- 3.4 有点动态内容的页面
- 3.5 小结
- 3.6 练习
- 3.7 高级测试技术
- 第 4 章 Rails 背后的 Ruby
- 4.1 导言
- 4.2 字符串和方法
- 4.3 其他数据类型
- 4.4 Ruby 类
- 4.5 小结
- 4.6 练习
- 第 5 章 完善布局
- 5.1 添加一些结构
- 5.2 Sass 和 Asset Pipeline
- 5.3 布局中的链接
- 5.4 用户注册:第一步
- 5.5 小结
- 5.6 练习
- 第 6 章 用户模型
- 6.1 用户模型
- 6.2 用户数据验证
- 6.3 添加安全密码
- 6.4 小结
- 6.5 练习
- 第 7 章 注册
- 7.1 显示用户的信息
- 7.2 注册表单
- 7.3 注册失败
- 7.4 注册成功
- 7.5 专业部署方案
- 7.6 小结
- 7.7 练习
- 第 8 章 登录和退出
- 8.1 会话
- 8.2 登录
- 8.3 退出
- 8.4 记住我
- 8.5 小结
- 8.6 练习
- 第 9 章 更新,显示和删除用户
- 9.1 更新用户
- 9.2 权限系统
- 9.3 列出所有用户
- 9.4 删除用户
- 9.5 小结
- 9.6 练习
- 第 10 章 账户激活和密码重设
- 10.1 账户激活
- 10.2 密码重设
- 10.3 在生产环境中发送邮件
- 10.4 小结
- 10.5 练习
- 10.6 证明超时失效的比较算式
- 第 11 章 用户的微博
- 11.1 微博模型
- 11.2 显示微博
- 11.3 微博相关的操作
- 11.4 微博中的图片
- 11.5 小结
- 11.6 练习
- 第 12 章 关注用户
- 12.1 “关系”模型
- 12.2 关注用户的网页界面
- 12.3 动态流
- 12.4 小结
- 12.5 练习