【概要】
1.結論
2.どのようにコーディングするか
3.開発環境
補足
1.結論
コントローラーにeditアクション・updateアクションをコーディングし、edit.html.erbに必要なヘルパーメソッドをコーディングする!
2.どのようにコーディングするか
※devise gemを使用しております。
Rails.application.routes.draw do
devise_for :users
root to:'XXXX#index'
resources :users, only: [:edit, :update] #---❶
end
❶:usersコントローラーに編集と更新アクションのみを命令したいのでresourcesにonlyをコーディングしています。
class UsersController < ApplicationController
def edit #---❶
end
def update #---❶
if current_user.update(user_params) #---❷
redirect_to root_path #---❸
else
render :edit #---❸
end
end
private
def user_params #---❹
params.require(:user).permit(:name, :email)
end
end
❶:ルーティングでも設定したようにアカウント(今回の場合はnameとemail)を編集させたいので、編集と編集したあとの更新機能命令を受け取ってmodel,viewに命令したいのでdefを使ってアクションを定義しています。
❷:どのアカウントに対して更新させたいかが不明なので、現在ログインしているuserに対して行っています。current_userはdevise gemを導入することで使用できます。
❸:更新が成功すればトップページに、更新が失敗すれば編集画面に戻るようにしています。簡単に説明すると更新されあとはuserの情報を更新したいので(=元のインスタンス変数の値が上書きをしたい)redirect toです。失敗した場合は、userの誤った情報を更新されないまま編集画面にただ戻ればいいのでrenderを使用しています。
※render/redirect toの違いは下記URLにて自分の記事でも説明していますが、検索すればたくさん出てきます。詳細が知りたければご自分で検索されたり、下記を参照されてください!
render と redirect_to の使い分け基準
❹:ストロングパラメーターを設定し、意図しないuserの編集更新を防いだままデータを受け取ります。requireメソッドを使用し、userモデルから情報を持ってきています。さらに詳細にパラメーターを指定したいのであればカラム名をキー名にします。
params.require(:モデル名).permit(:カラム名(キー名になる), ・・・・ )
ヘルパーメソッドのform_withを使用して現在ログインしている人の情報を送れば簡単なアカウント編集機能は完了です。
<%= form_with model: current_user, local: true do |f|%>
<%= f.text_field :name %>
<%= f.email_field :email %>
<%= f.submit "更新"%>
<% end %>
3.開発環境
Ruby 2.6.5
Rails 6.0.3.3
MySQL 5.6.47
SequelPro 1.1.2
VScode
補足
2.❹でmergeメソッドを使用すると、ハッシュを結合させることができ、情報を追加することができます。
params.require(:user).permit(:name, :email).merge(user_id: current_user.id)