道場コースでは省略されてますが、ユーザの登録、変更、一覧表示を作成します。
扱うデータが投稿データからユーザデータに変わるくらいで大きく違いは無いのでザックリと。
データベースの準備
rails g model User name:string email:string rails db:migrate
コンソール(rails console)からユーザデータを1件登録しておきます。
user = User.new(name: "hoge", email: "hoge") user.save
Userモデルにバリデーションを設定します。(emailは重複不可、にします)
validates :name, {presence: true} validates :email, {presence: true, uniqueness: true}
ユーザ一覧画面の作成
railsコマンドで雛形をマルッと作成します。
rails g controller users index
indexアクションは次の通り。
def index @users = User.all end
ビューは次の通り。
<% @users.each do |user| %> <div class="users-index-item"> <div class="user-right"> <%= user.name %> </div> </div> <% end %>
共通ヘッダにユーザ一覧へのリンクを作成します。
<li> <%= link_to("ユーザ一覧", "/users/index") %> </li>
ユーザ詳細表示画面の作成
ルーティング追加
get "users/:id" => "users#show"
showアクション作成
def show @user = User.find_by(id: params[:id]) end
ビュー(show.html.erb)作成
<h2><%= @user.name %></h2> <p><%= @user.email %></p>
ユーザ一覧ビューを次のように変更して、詳細画面へのリンクにします。
<%= user.name %> ↓ <%= link_to(user.name, "/users/#{user.id}") %>
ユーザ登録画面
ルーティング追加
get "signup" => "users#new"
newアクション作成
def new @user = User.new end
ビュー(new.html.erb)作成
<% @user.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <%= form_tag("/users/create") do %> <p>ユーザー名</p> <input name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input name="email" value="<%= @user.email %>"> <input type="submit" value="新規登録"> <% end %>
ユーザ登録処理の作成
ルーティング追加
post "users/create" => "users#create"
処理だけなのでビューは無し。createアクションを追加。
def create @user = User.new(name: params[:name], email: params[:email]) if @user.save flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end
ユーザ変更画面の作成
ルーティング追加
get "users/:id/edit" => "users#edit"
ビュー(edit.html.erb)を作成
<% @user.errors.full_messages.each do |message| %> <div class="form-error"> <%= message %> </div> <% end %> <%= form_tag("/users/#{@user.id}/update") do %> <p>ユーザー名</p> <input type="text" name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input type="text" name="email" value="<%= @user.email %>"> <input type="submit" value="保存"> <% end %>
editアクションを作成
def edit @user = User.find_by(id: params[:id]) end
詳細画面(show.html.erb)にリンクを追加
<%= link_to("編集","/users/#{@user.id}/edit") %>
ユーザ変更処理の作成
ルーティング追加
post "users/:id/update" => "users#update"
updateアクションの作成
def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.email = params[:email] if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render("users/edit") end end
ログイン処理につづきます。
コメント