20200930_アウトプット(devise関連)

アプトプット画像

学んだこと

deviseを用いたユーザーの管理機能について学んだ。


サインアップ/ログイン機能

【1】ログインしていない場合に、ログイン画面に遷移するように実装する。
class ApplicationController < ActionController::Base
  before_action :authenticate_user!
end
  • authenticate_user!メソッドを使用する。

  • authenticate(読:オセンティケイトゥ 意:認証する)

  • ビフォーアクションに定義することで、他のアクションが読み込まれる前に、ログイン画面へ遷移させることができる。




【2】ユーザーの名前をDBへ保存できるように設定する。
class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end
  • Rails では、セキュリティ対策のため、保存のルールを予め決めておかないと保存できない仕組みになっている。deviseにおいて、emailやpasswordはデフォルトで作成されるが、nameのように自分で追加したカラムがある場合には、保存するルールを決める。

  • devise_parameter_sanitizerメソッドとは、deviseでユーザー登録をする場合に使用でき、「特定のカラムを許容する」メソッド。

  • 今回の「configure_permitted_parametersメソッド」の内容の意味は、「nameカラム」を追加したので、このメソッドを使用し、「name」キーの内容の保存をpermitメソッドで許可するということ。


ユーザー情報編集機能

#ルーティングの設定
Rails.application.routes.draw do
  devise_for :users
  root to: "messages#index"
  resources :users, only: [:edit, :update]
end


#ターミナルで実行
% rails g controller users


#usersコントローラーの設定
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
【1】ユーザー情報編集画面が表示されるように設定する。
  • 「devise_for :users」により、基本的なルーティングは設定しなくても遷移されるが、今回のようなユーザーの編集画面を作るには「:edit」と「:update」を追加する必要がある。

  • ルーティングを設定したら、コントローラーを作成する。



【2】ユーザー情報が更新されるように実装する。
  • Userモデルの更新を行うupdateアクションをusersコントローラーに定義する。

  • ストロングパラメーターを使用し、user_paramsを定義する。

  • user_paramsの中でpermitメソッドを使用し、「name」と「email」の編集を許可する。

  • ユーザー情報が格納されているcurrent_userメソッドを使用して、ログインしているユーザーの情報を更新する。



【3】更新が成功するとチャット画面に遷移して、失敗するとeditページに戻ってくるように実装する。
  • updateアクション内で、保存できた場合とできなかった場合で条件分岐の処理を行う。

  • current_user.updateに成功した場合、root(チャット画面)にリダイレクトする。

  • 失敗した場合、render :editとeditのアクションを指定しているため、editのビューが表示される。

renderとredirect_toの違いって?
  • renderとは、呼び出すビューを指定するメソッド。(コントローラーとビュー、どちらでも使用可。)
render redirect_to
新たにリクエストされることなくそのままビューを表示する(レンダーからビューへ) 新たなリクエストを送信されたときと同じ動きをする(リダイレクトから、ルーティング・コントローラーを経由してビューへ)
元のインスタンス変数の値は上書きされない(今回=フォームに入力した内容を保持したままユーザー編集画面に戻る) 元のインスタンス変数の値は上書きされる




ログアウト機能

【1】ログアウトできるようにビューにリンク先の設定を行う。
#app/views/users/edit.html.erb内
<%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: 'btn'%>
  • rails routes」コマンドにて、ログアウトに関するパスを探す。

  • ポイントとして、基本的なdeviseに関するルーティングは、元々備わっているため(今回で言えばsessionsコントローラーのdestroyアクション)ルーティングにおいて「destroy」を定義しなくても、遷移する。(ルーティング内の「devise_for :users」に備わっている。)

バリデーション機能

【1】モデルにバリデーション機能をつける。
#app/models/user.rb内
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable,  :validatable

  validates :name, presence: true

end
  • 空の場合はDBに保存しないというバリデーションを設定した。

  • deviseに対して後付けしたカラムは、自分でバリデーションを設定する必要がある。




積み残し(わからないところ)

  • <%= form_with(model: @tweet, local: true) do |form| %>※モデル

  • deviseに関するマイグレーションファイルは書き方がビューに影響する?(名前、Eメール、パスワードがあったとして、ユーザーに入力してもらいたい順番で書かないと順番異なるのか?)




感想

  • ブログにアウトプットとして書くために、もう一回見返したり考えたりすると、理解していない部分が改めて見つかるので大切だと実感。

  • 最近、パソコン見すぎて、目が乾く。

  • MVCの復習を挟んだことにより、やっと、想像できるようになった。(この機能入れるなら、ルーティング、モデルだろう、という予想)

  • 想像できるものの、実際にコードを書くと、細かい部分まで理解できてないのが悔しい。(例えば、これはアクションだからこう表記する、シンボルだからこう表記するというようなこと。)

  • deviseのアクションなのか、メソッドなのか、やっと理解できた気がする。メソッドに関してはもう一回、おさらいしたいな。