先日ログイン機能を実装したので、ユーザー詳細を作成して行きます。
まずはコントローラーを作成して行きます。
同時に一覧(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が空だと怒られました。
コントローラーの記載が間違ってないか確かめましたが、問題なさそうです。
全角も入ってないし、命名も同じ、、、
コントローラーを修正したので、サーバーの再起動が必要でした。
コメント