###Userリソース
ユーザープロフィールページを作成するには、その前にデータベースにユーザーが登録
されている必要があります。
このWebサイトでは、登録ページがない状態でどうやってユーザーを登録しておけばよいでしょうか
。
前回Railsコンソールを使ってユーザーレコードを登録してありました。
したがって、データベースの中に一人のユーザーがいるはずです。
>> User.count
(1.5ms) SELECT sqlite_version(*)
(0.7ms) SELECT COUNT(*) FROM "users"
=> 3
>> User.first
User Load (0.8ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]]
=> #<User id: 1, name: "Michael Hartl", email: "michael@example.com", created_at: "2021-09-23 05:29:52", updated_at: "2021-09-27 16:05:45", password_digest: [FILTERED]>
次の目標は、このようなユーザー情報をWebアプリケーション上に表示
することです。
ここでは、Railsアプリケーションで好まれているRESTアーキテクチャの習慣に従う
ことにしましょう。
つまり、データの作成
、表示
、更新
、削除
をリソース(Resources)として扱うということです。
HTTP標準には、これらに対応する````4つの基本操作(POST、GET、PATCH、DELETE)```が定義されているので、これらの基本操作を各アクションに割り当てていきます。
RESTの原則に従う場合、リソースへの参照はリソース名とユニークなIDを使う
のが普通です。
ユーザーをリソースとみなす場合、id=1のユーザーを参照するということは、/users/1
というURLに対してGETリクエストを発行するということを意味します。
ここでshowというアクションの種類は、暗黙のリクエスト
になります。RailsのREST機能が有効になっていると、GETリクエストは自動的にshowアクションとして扱われます
。
2.2.1で説明したとおり、id=1のユーザーにアクセスするためのページのURIは/users/1となります。ただし、現時点ではこのURLを使ってもエラーになります(図 7.4)。
No route matches [GET] "/user/1"
Rails.root: /home/ubuntu/environment/sample_app
プレビューを表示させた。失敗した。
/user/1
のルートがない らしい。
/users/1 のURLを有効にするために、routesファイル(config/routes.rb)に次の1行を追加します。
resources :users
####Usersリソースをroutesファイルに追加する
Rails.application.routes.draw do
root 'static_pages#home'
# 何の意味がわからん
# ホーム画面がhomeページなるらしい
get '/help', to: 'static_pages#help'
# static_pagesコントローラからhomeアクションに紐付けされる
# getでアクセルすることでページを取得することができる
get '/about', to: 'static_pages#about'
# 何を書いているかはわからない
get '/contact', to: 'static_pages#contact'
# aboutアクションにGETリクエストを送る
get '/signup', to: 'users#new'
# urlに/signupと書くとuserコントローラのnewアクションを起こす
resources :users
# /users/1の有効にするため
end
今の短期的な目的はWebページ上にユーザーを表示することではありますが、resources :users
という行は、ユーザー情報を表示するURL(/users/1)を追加するためだけのものではありません
。
サンプルアプリケーションにこの1行を追加すると、ユーザーのURLを生成するための多数の名前付きルートと共に、RESTfulなUsersリソースで必要となるすべてのアクションが利用できる
ようになるのです。
この行に対応するURLやアクション、名前付きルートを確認。
プレビューで確認
Unknown action
The action 'show' could not be found for UsersController
showアクションが見つからない。
ユーザーを表示するために、標準的なRailsの場所
を使うことにします。
Railsにおける標準的な場所とは、app/views/users/show.html.erb
を指します。
ジェネレータを使ったときとは異なり(new.html.erbビューを作成したときと異なり)、今回はジェネレータを使っていないので、この````show.html.erbファイルは手動で作成する必要があります。したがって、
app/views/users/show.html.erb```ファイルを手動で作成し7 、リスト 7.4の内容を貼り付けてください。
####ユーザー情報を表示するための仮のビュー
<%= @user.name %>, <%= @user.email %>
このビューでは埋め込みRubyを使ってユーザー名とメールアドレス
を表示しています。
インスタンス変数@userがあることを前提としています。
もちろん、ユーザー表示ページの最終的な状態はこれとは大きく異なりますし、このメールアドレスがこのまま一般に公開されるようなこともありません。
ユーザー表示ビューが正常に動作するためには、Usersコントローラ内のshowアクションに対応する@user変数を定義する必要
があります。
ご想像のとおり、ここではUserモデルのfindメソッドを使ってデータベースからユーザーを取り出します
。
####Usersコントローラのshowアクション
app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
# データベースからユーザー情報を取り出す
end
def new
end
end
ユーザーのid読み出しにはparams
を使いました。
Usersコントローラにリクエストが正常に送信されると、params[:id]の部分はユーザーidの1に置き換わります
。
つまりfindメソッドのUser.find(1)と同じ
になります。
ユーザーのビューとアクションが定義されたので、/users/1 は完全に動作
するようになりました。
このとき、もし````bcrypt gemを追加してからまだ一度もRailsサーバーを再起動させていない場合は、ここで再起動してみてください。 動作したら /users/1 にアクセスし、
デバッグ情報からparams[:id]の値を確認できることを確認```してください。
--- !ruby/object:ActionController::Parameters
parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
controller: users
action: show
id: '1'
permitted: false
このid: '1'は /users/:id から取得した値です。この値を使って
User.find(params[:id])
上のコードでid=1のユーザーを検索できる、といった仕組みになっているのです
####演習
1.埋め込みRubyを使って、マジックカラム(created_atとupdated_at)の値をshowページに表示してみましょう(リスト 7.4)。
ユーザー情報を確認
app/views/users/show.html.erb
<%= @user.name %>, <%= @user.email %>
<%= @user.created_at %>, <%= @user.updated_at %>
表示された。
2.埋め込みRubyを使って、Time.nowの結果をshowページに表示してみましょう。
ページを更新すると、その結果はどう変わっていますか? 確認してみてください。
<%= @user.name %>, <%= @user.email %>
<%= @user.created_at %>, <%= @user.updated_at %>,
<%= Time.now %>
表示された。