Ruby on Rails5 Progate Ⅵ ユーザーの登録・編集

〜 ユーザーの登録 〜
 1. ユーザーの一覧
 2. ユーザーの詳細
 3. ユーザーの新規登録
 4. ユーザーの情報編集


ユーザーを管理するテーブルモデルの作成

 usersテーブルを用意
(データ型: string は短い文字列を保存する際に使う)
[コマンドライン] *$ rails consoleを起動する前に実行

  $rails g model User name:string email:string
//$rails g model モデル名 カラム名:データ型

  $rails db:migrate
//テーブル変更の反映


ユーザーのデータを作る

ex.)[rails console]  Userモデルのインスタンス作成

user = User.new(name:"カイル・リース", email:"Kyle.lease@gmail.com")
user.save

バリデーションの追加

[models/user.rb]
 validates :name{presence: true}
 validates :email,{presence: true, uniqueness: true}  //emailに重複が無いようにする
                                                      //「:」の位置注意


1. ユーザー一覧ページの作成

[コマンドライン]
$ rails g controller users index  //コントローラ名[users] アクション名[index]

[users_controller.rb]
def index
 @users = User.all  //@usersにUserテーブルの情報を代入
end

[users/index.html.erb]
ex.)//ユーザー名一覧をhtmlに表示
<% @users.each do |user|%>
  ~
  <%= user.name %>
  ~
<% end %>


2.ユーザー詳細ページの作成

ユーザーごとにURLにidを含めて表示する
[routes.rb]
get "users/:id" => "users#show" //URLの末尾がid(数値)になるので


[users_controller.rb]

def show
 @users = User.find_by(id: params[:id])
end


ex.)
[users/show.html.erb]

<%= @users.name %>
<%= @users.email %>


[users/index.html.erb]
<% @users.each do |user| %>

  <%= link_to(user.name, "/users/#{user.id}")%>
                        //一覧にユーザー名を表示させてidごとにリンクを設定
<% end %>


〜ユーザーの登録機能の作成〜

新規登録の流れ
 1.ユーザー登録ページの作成
 2.ユーザーの保存
 3.サクセス・エラーメッセージの表示


ユーザー登録ページの作成

 URL = /signup でアクセスできるようにする
   *signup = 新規登録(英語)
 アクション名= new  
 URL = "signup"

 フォーム部分の作成

 ユーザー名とメール登録は<input>タグの一行フォームで十分
[routes.rb]
get "signup" = "users#new" 
          //URL = loclalhost:3000/signup で ures/new.html.erbにアクセスする

[users_controller.rb]
def new
end



ex.)見た目
[application.html.erb]
//ヘッダー部分
<%= link_to("新規登録", "/signup")%>

[users/new.html.erb]
<p>ユーザー名</p>
〜 <input>


ユーザーの保存

 createアクションで保存・ユーザー一覧に戻るを設定
 inputタグにテーブルの情報ごとのname属性を設定
 *name属性の値が送信されるハッシュのキーになる
 フォームから送信されるデータ受け取りのためにformタグメソッドで囲んでデータの送信先を指定
[routes.rb]
post "posts/create" => "posts#create"

[users_controller.rb]

def create

 @users = User.new(name: params[:name], email: params[:email])
 @users.save
 redirect_to("/users/#{@users.id}")

end

[users/new.html.erb]
ex.)
<%= form_tag("/users/create") do %>
  〜〜 <input name="name">
      <input name="email">
<% end %>


保存に成功・失敗した場合の処理

 flashの使用
 1.フォームの表示
 2.エラー文を表示
 3.フォームに初期値を入れる


 フォームの初期値

 <input>タグではvalue値が初期値になる
  =value属性にRubyを埋め込む

[users_controller.rb]
def new
 @user = User.new   //これ書かないとrenderで戻った時にエラーが出るらしい
end

def create
 @user = User.new(name: params[:name], email: params[:email])
 if @user.save
  flash[:notice] = "ユーザ登録が完了しました"
 else
  render("user/new")
 end
end

[users/new.html.erb]
〜
<% @each.errors.full_messages.each do |message| %>
   <div class="form-error">
     <%= message>
   </div>
<% end %>
//エラーメッセージを失敗してrenderした際に表示

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


〜ユーザー編集の機能〜

 1.ユーザー編集ページの作成
 2.変更の保存
 3.サクセス・エラーメッセージの表示
editアクションで編集ページの機能作成
updateアクションで受け取る


ユーザー編集ページ

URLには「localhost:3000/users/1/edit」のように編集するユーザーの id を含める
ユーザー編集フォームには初期値を設定

1.ユーザー編集ページの作成

editアクション
[routes.rb]
"get "users/:id/edit" => "users#edit"

[users_controller.rb]
def edit
 @user = User.find_by(id: params[:id])
end

ex.)
[users/show.html.erb] 
 〜
<%= link_to("編集","/users/#{@users.id}/edit") %>

[users/edit.html.erb]
 〜〜


ユーザー編集機能の完成

2.変更の保存
3.サクセス・エラーメッセージの表示
updateアクション
*render  は id の書き込み不要、頭の「/」不要
[routes.rb]
post "users/:id/update" => "users#update"

[users.controller.rb]
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


[users/edit.html.erb]
 〜
<% @each.errors.full_messages.each do |message| %>
  <div class="form-error">
     <%= message>
   </div>
<% end %>
//エラーメッセージを失敗してrenderした際に表示

<%= form_tag("/users/#{@user.id}/update") do %>
 〜
  <input name="name" value="<%= @user.name %>">
   <input name="email" value="<%= @user.email %>">
  <input type="submit" value="保存">
<% end %>



この記事が気に入ったらサポートをしてみませんか?