0
0

More than 1 year has passed since last update.

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

Posted at

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 %>

表示された。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0