ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 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) 地址上的“注册”页面