A Users resource

為了要製作使用者個人資訊頁面,我們需要從資料庫裡取出使用者的資料。之前透過 Rails console 建立的使用者就派上用場了:

$ rails console
> User.count
=> 1
> User.first
=> #<User id: 1, name: "Luffy Wang", email: "[email protected]", created_at: "2016-03-08 05:52:41", updated_at: "2016-03-08 05:52:41", password_digest: "$2a$10$ecVIl7oAqJctPcf7Crnpy.BQrSGGPNGjUvuS2C1DFL8...">

我們要遵循 Rails 的 REST 架構,把資料視為 resources,可以建立、建立、顯示、更新、刪除(CRUD: create/read/update/destroy),對照 HTTP 標準的 POST/GET/PATCH/DELETE。

按照 REST 原則,resources 會使用 resource 名稱和獨特的識別符號。可以把使用者看成一個資源(User resource),如果查看 id 為 1 的使用者,會對 URL/users/1 發出 GET 請求。REST 會自動把 GET 請求交給 show action 處理。

不過現在如果前往 /user/1 會發生錯誤,查看 Rails server 會看到這樣的錯誤訊息:

所以現在要來設定路由,以便能對應到 /user/1 這樣的網址:

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'
  resources :users
end

resources :users 會自動產生與 action 對應的具名路由、URLs:

HTTP request URL Action Named route Purpose
GET /users index users_path 列出所有使用者的頁面
GET /users/1 show users_path(user) 顯示使用者的頁面
GET /users/new new new_user_path 建立使用者的頁面(sign up)
POST /users create users_path 建立使用者
GET /users/1/edit edit edit_user_path(user) 編輯 id 1 的使用者頁面
PATCH /users/1 update user_path(user) 更新使用者
DELETE /users/1 destroy user_path(user) 刪除使用者

重新再重整畫面,還是出現錯誤:

所以接下來要建立 app/views/users/show.html.erb 以及在 Users controller 設定 show action:

app/views/users/show.html.erb

<%= @user.name %>, <%= @user.email %>

使用 @user 變數來讀取使用者的資料。

app/controllers/users_controller.rb

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def new
  end
end

使用 params 來取得使用的 id。當我們向 Users controller 請求回應時,params[:id] 會去找出 id 1 的使用者,就像之前使用 User.find(1) 的方法一樣,雖然 params[:id] 是一個字串 "1",但 find 方法會幫你轉成整數(integer)。

現在重整 /users/1 頁面,可以看到畫面了:

如果重整畫面還是出現錯誤:

cannot load such file -- bcrypt

可能之前增加 bcrypt 之後,沒有重新啟動 Rails server,所以再重啟就好了。

現在除錯訊息多了一個 params[:id] 的資訊:

---
action: show
controller: users
id: '1'