ユーザー管理機能 編集機能実装編
どうもバンバンです。
今回はRailsでユーザー管理機能を実装する方法を復習を兼ねて 残していこうと思います。
ユーザ管理機能は全部書くと長くなるので何編かに分けて投稿していきます。
はじめに
前回 DBへの保存とページの作成を終えたので、今回はユーザー情報編集機能を実装していきます。
いつものように用語集→手順で進めていきます。
用語集
7つのアクション
アクション名
|
内容
|
---|---|
index
|
一覧表示
|
show
|
詳細表示
|
new
|
生成
|
create
|
保存
|
edit
|
編集
|
update
|
更新
|
destroy
|
削除
|
基本プログラミング用語はそこまで丸暗記する必要ないと思っていますが、これはよく出てくるので覚えておいたほうが効率が良いです。
resourcesメソッド
7つのアクションへのルーティングを自動生成するメソッド
ルーティングを生成する=config/routes.rb に記載
引数に:シンボルと指定するとそのパスに対応するルーティングが生成される。
ex) resources :users ←/usesのパスに対応するルーティング
即ちcontrollers/users_controller.rbで7つのアクションを定義できる。
onlyオプション
resourcesにオプションとして加えると 指定したアクションのみのルーティングを自動生成する。
ex) resources :users これだけだと7つ全て生成
そこで resources:users, only: :editとすると
controllers/users_controller.rbでeditのアクションのみ定義できる
絞る理由:不要なアクションを設定しておくことで余分なエラーが発生する恐れがあるから。
編集と更新の機能だけあれば良いならonly: [:edit , :update]
redirect_toメソッド
redirect_to パスと記載 パスはrails routesで確認
新たなリクエストを送信された時と同じ動きになる。
よってインスタンス変数が上書きされた状態でビュー画面へたどり着く
ex)controllers/users_controller.rb
def update
if current_user.update(user_params)
redirect_to root_path
現在のユーザーのユーザー情報更新が正しくできた場合新しい更新データを持ったままルーティング→コントローラー→ビューの流れでたどり着く
最後にビューで表示されるユーザー情報は更新された情報
renderメソッド
render :アクションと記載
新たにリクエストされることがない。
よってインスタンス変数に変化がないままビュー画面へたどりつく(というよる単純に表示される)
else
render :edit
end
値が正しくなければ(空欄など)情報は上書きされずedit.html.erbへ戻る
手順
今回はユーザー情報の編集機能を実装するので
ルーティング→コントローラ作成と設定→ページ遷移も実装
ルーティング
ユーザー編集に必要なルーティングはeditとupdate
usersコントローラでeditとupdateが利用できるように
resources :users,only:[:edit, :update]と記載してルーティング設定
コントローラー生成
rails g controller コントローラー名
今回のコントローラー名はusers
コントローラー設定
editとupdateをルーティングしているのでその2つのアクションを定義する
edit・・編集画面を表示させるだけでよいので
def edit
end
と記載し、views/edit.html.erbの表示をリクエストする
*views/edit.html.erbは既に作成済みとして話を続けます
update・・編集内容が更新されるように設定
def update
current_user.update(user_params)
↑ストロングパラメーターで許可されているnameとemailのみ
更新 current_user=現在のユーザー
end
private
def user_params
params.require(:user).permit(:name, :email)
↑nameとemailの編集のみ許可するストロングパラメーター
end
end
前編でも述べましたがストロングパラメーターがなぜ必要なのかは後日ブログに書こうと思っています。
ページ遷移の機能実装
更新が成功したときはチャット画面へ移動
失敗したときはeditページに戻ってくるように設定
redirect toメソッドとrenderメソッドを利用する
def update
if current_user.update(user_params)
redirect_to root_path
↑更新が成功した場合root_path(チャット画面)へ
else
render :edit
↑失敗した場合editページを表示する(情報は更新されていない)
end
end
private
def user_params
params.require(:user).permit(:name, :email)
end
今回はここまで 次回はログアウト機能の実装編になります。