Ruby on railsでユーザー詳細を作成する

Ruby on Rails

先日ログイン機能を実装したので、ユーザー詳細を作成して行きます。

まずはコントローラーを作成して行きます。
同時に一覧(index)、詳細 (show)、編集(edit)を作成して行きます。

% docker-compose run web rails g controller users index show edit
Creating dokosumu_web_run ... done
      create  app/controllers/users_controller.rb
       route  get 'users/index'
get 'users/show'
get 'users/edit'
      invoke  erb
      create    app/views/users
      create    app/views/users/index.html.erb
      create    app/views/users/show.html.erb
      create    app/views/users/edit.html.erb
      invoke  test_unit
      create    test/controllers/users_controller_test.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    js
      create      app/assets/javascripts/users.js
      invoke    css
      create      app/assets/stylesheets/users.css

作成されました。

まずは/app/controllers/users_controller.rbが以下のように作成されています。

class UsersController < ApplicationController
  def index
  end

  def show
  end

  def edit
  end
end

viewもapp/views/users/edit.html.erb、index.html.erb、show.html.erbが作成されています。

まずはルーティングを行います。先ほどコントローラーを作った際に以下のように自動的にgetが3つ作成されていました。

Rails.application.routes.draw do
  get 'users/index'
  get 'users/show'
  get 'users/edit'
  root to: "home#index"
  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions'
  }
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
end

以下のようにresourcesでルーティングを記載しました。
ルーティングの基本がわからない方は「rails ルーティング」などでググってみて下さい。

Rails.application.routes.draw do
  root to: "home#index"
  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: 'users/sessions'
  }
  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
  resources :users
end

こちらを記載して、ルーティングを確認してみると以下のようにルーティングされていました。

% rails routes
                    users GET    /users(.:format)                                                                         users#index
                          POST   /users(.:format)                                                                         users#create
                 new_user GET    /users/new(.:format)                                                                     users#new
                edit_user GET    /users/:id/edit(.:format)                                                                users#edit
                     user GET    /users/:id(.:format)                                                                     users#show
                          PATCH  /users/:id(.:format)                                                                     users#update
                          PUT    /users/:id(.:format)                                                                     users#update
                          DELETE /users/:id(.:format)                                                                     users#destroy

次はコントローラーを作成して行きます。

app/controllers/users_controller.rbのindexを以下のようにしました。

usersというインスタンス変数(@をつけたもの)にUserモデルを全て取得しています。

  def index
    @users = User.all
  end

次はapp/views/users/index.html.erbに以下のコードで、全てのユーザー名を取り出して行きます。

<% @users.each do |user| %>
    <%= user.username %>
<% end %>

画面で確認してみましょう。

確認するにはhttp://localhost:3000/usersにアクセスしてみましょう。

以下のエラーが出ました。

Showing /myapp/app/views/users/index.html.erb where line #3 raised:

undefined method `each' for nil:NilClass
Extracted source (around line #3):
              
1 <h1>Users#index</h1>
2 <p>Find me in app/views/users/index.html.erb</p>
3 <% @users.each do |user| %>
4     <%= user.username %>
5 <% end %>

@usersが空だと怒られました。
コントローラーの記載が間違ってないか確かめましたが、問題なさそうです。
全角も入ってないし、命名も同じ、、、

コントローラーを修正したので、サーバーの再起動が必要でした。

フリーランスを目指すなら【テックパートナーズカレッジ】

未経験者向けWEBスクール【SHElikes】

コメント