5.4 用户注册:第一步

为了完成本章的目标,本节要设置“注册”页面的路由,为此要创建第二个控制器。这是允许用户注册重要的第一步,我们会在第 6 章完成第二步,创建用户模型,第 7 章会完成整个功能。

5.4.1 用户控制器

我们在 3.2 节创建了第一个控制器——静态页面控制器。现在要创建第二个,用户控制器。和之前一样,我们使用 generate 命令创建所需的控制器骨架,包含用户注册页面所需的动作。遵照 Rails 使用的 REST 架构约定,我们把这个动作命名为 new,把 new 作为参数传给 generate 命令就可以自动创建这个动作,如代码清单 5.28 所示。

代码清单 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)和一个占位视图(代码清单 5.31)。除此之外还会为新建用户页面生成一个简单的测试(代码清单 5.32),这个测试现在可以通过:

代码清单 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,我们希望这个页面的 URL 是 /signup。为此,我们要参照代码清单 5.22 的做法,为“注册”页面添加规则 get '/signup',如代码清单 5.33 所示。

代码清单 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 中使用这个具名路由。针对“注册”页面的测试留作5.6 节

代码清单 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 所示。

代码清单 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 章再添加“登录”页面的路由。新创建的用户注册页面如图 5.9 所示。

new signup page 3rd edition图 5.9:/signup 地址上的“注册”页面