railsコンソール第七章 Userリソース

###Userリソース
ユーザープロフィールページを作成するには、その前に```データベースにユーザーが登録```されている必要があります。
このWebサイトでは、```登録ページがない状態でどうやってユーザーを登録しておけばよいでしょうか```。
前回Railsコンソールを使ってユーザーレコードを登録してありました。
したがって、データベースの中に一人のユーザーがいるはずです。

```rb
>> 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標準には、これらに対応する````４つの基本操作（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ファイルに追加する

```rb
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）を追加するためだけのものではありません　```。
サンプルアプリケーションにこの１行を追加すると、ユーザーの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の内容を貼り付けてください。
####ユーザー情報を表示するための仮のビュー

```html
<%= @user.name %>, <%= @user.email %>
```
このビューでは```埋め込みRubyを使ってユーザー名とメールアドレス```を表示しています。
インスタンス変数@userがあることを前提としています。
もちろん、ユーザー表示ページの最終的な状態はこれとは大きく異なりますし、このメールアドレスがこのまま一般に公開されるようなこともありません。

ユーザー表示ビューが正常に動作するためには、Usersコントローラ内のshowアクションに対応する```@user変数を定義する必要```があります。
ご想像のとおり、ここではUserモデルのfindメソッドを使って```データベースからユーザーを取り出します```。

####Usersコントローラのshowアクション
app/controllers/users_controller.rb

```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 から取得した値です。この値を使って

```rb
User.find(params[:id])
```
上のコードでid=1のユーザーを検索できる、といった仕組みになっているのです

####演習
1.埋め込みRubyを使って、マジックカラム（created_atとupdated_at）の値をshowページに表示してみましょう（リスト 7.4）。
ユーザー情報を確認
app/views/users/show.html.erb

```html
<%= @user.name %>, <%= @user.email %>
<%= @user.created_at %>, <%= @user.updated_at %>
```
表示された。
2.埋め込みRubyを使って、Time.nowの結果をshowページに表示してみましょう。
ページを更新すると、その結果はどう変わっていますか? 確認してみてください。

```html
<%= @user.name %>, <%= @user.email %>
<%= @user.created_at %>, <%= @user.updated_at %>,
<%= Time.now %>
```
表示された。