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'