LoginSignup
0
0

More than 3 years have passed since last update.

Ruby:アカウント編集機能

Last updated at Posted at 2020-10-20

【概要】

1.結論

2.どのようにコーディングするか

3.開発環境

補足

1.結論

コントローラーにeditアクション・updateアクションをコーディングし、edit.html.erbに必要なヘルパーメソッドをコーディングする!

2.どのようにコーディングするか

※devise gemを使用しております。

config/roites.rb
Rails.application.routes.draw do
  devise_for :users
  root to:'XXXX#index'

  resources :users, only: [:edit, :update] #---❶
end

❶:usersコントローラーに編集と更新アクションのみを命令したいのでresourcesにonlyをコーディングしています。

app/controllers/users_controller.rb
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を使用して現在ログインしている人の情報を送れば簡単なアカウント編集機能は完了です。

app/views/users/edit.html.erb
<%= 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)


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0