deviseを使ったログインユーザーと未ログインユーザーの遷移分け


何をしたいか

ログインをした後に見せたいホーム画面的なものをroot_pathに設定していたので
ログインしていないユーザーはアプリの紹介ページに飛ぶように設定をします

記述

このページに書いてある通りdeviseを使ったものになります。
まだdeviseを入れてない方は入れてからこのページに戻ってきてください。
さて本題に入ります
まずコントローラーの記述を変えます。

photos_controller.rb
class PhotosController < ApplicationController
  before_action :move_to_index #ここを追加で記述

  def index    
  end
#ここから下を追加で記述
  private

  def move_to_index
    unless user_signed_in?
      redirect_to controller: :homes, action: :index
    end
  end

end

何をしているか上から解説します

before_action :move_to_index

before_actionはコントローラーの全てのアクションが実行される前に何らかの処理を行う時に使用するものです
そのbefore_actionにmove_to_indexというメソッドを指定しています。
メソッドなのでここは皆さんで記述が違います
じゃぁそのメソッドはどこで定義してあるの??それは後ほど解説します。

private

クラス外から呼び出すことのできないメソッドのことです。
Rubyでは、privateと記述した以下のコードがプライベートメソッドになります。
僕の解釈はこのコントローラー内でしか使用できないメソッドと解釈しています。違ったらすみません…

def move_to_index

ここでmove_to_indexを定義しています。
先ほどのbefore_action :move_to_indexに繋がるわけです
ではそのmove_to_indexではどのようなことをしているのか見てきます

unless user_signed_in?

user_signed_in?はdeviseを入れることで使えるヘルパーメソッドです
ユーザーがログイン済みかどうか判断します
そこにunless 〜がないならのような意味です
この単語がくると、ログインしていなければ〜で次の行に進みます

redirect_to controller: :homes, action: :index

少し文が長いので
redirect_toにまず注目ですこれは、指定したURLに遷移させることができるメソッドです
なので

controller.rb
redirect_to "http://www.○○○○.com"

でもできるし

controller.rb
redirect_to root_path

のようにPrefix名も指定できます

controller.rb
redirect_to controller: :homes, action: :index

最後に指定したコントローラーのアクションを指定することもできます

他にもまだできるので是非検索してみてください

これで流れとしては
indexが読み込まれる前にbefore_actionで先にmobe_to_indexメソッドを読みます。その中にはユーザーがログインしていなければ、ここに遷移すると設定ができました。

ルーティング

コントローラーにて

redirect_to controller: :homes, action: :index

と最後記述しているの
homesコントローラーのindexアクションが呼ばれます

routes.rb
get '/homes/home', to:'homes#index'

を記述します
/homes/homeはURL名の指定です

こんな感じになっています。
そしてhomes#index
homesコントローラーのindexアクションを指定します
これで終わりです