ProgateでRuby on Railsコースを復習(その3)

Ruby
スポンサーリンク

道場コースでは省略されてますが、ユーザの登録、変更、一覧表示を作成します。

扱うデータが投稿データからユーザデータに変わるくらいで大きく違いは無いのでザックリと。

スポンサーリンク

データベースの準備

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

 

ログイン処理につづきます。

コメント