アラフォーがお金持ちになるためエンジニアになったブログ

お金も根性も学歴もないアラフォーまきのがエンジニアになってお金持ち目指すよ!

【Railsメモ】deviseで複数モデルを持たせたときのログイン後の飛び先指定

どうも、アラフォーまきのです。



ちょっとしためも。


deviseで複数のモデルを管理

こちらの記事のおかげでとってもあっさりとdeviseにモデルを複数持たせることができました。ありがとうございます。

qiita.com



私はuserとmanagementの2つを管理させてみました。


それぞれのmodelでログイン後の表示ページを変える

こちらのasnwerの通りに分岐を変えることで、モデルごとの飛び先を変えることができました。ありがとうございます。

teratail.com


私の場合、userさんはuserのマイページへ、managementさんはmanagementのマイページへ飛んでもらいたくて、以下のようにしました。

  #sign_in後の飛び先
  def after_sign_in_path_for(resource)
    case resource
    when User
      users_mypage_path
    when Management
      managements_mypage_path
    end
  end

managementにのロールごとに違うページに行かせたくなった


実は、managementに登録されるユーザーさんにはロール設定があります。



ここでは例として、マネジメントAになるユーザーさんと、マネジメントBになるユーザーさんとしておきます。



マネジメントAに配属されるユーザーさんと、マネジメントBに配属されるユーザーさんでは、それぞれでできることが違います。



なもんで、ログインした後に飛んでいってほしいマイページも分けたくなりました。



で、試しに以下のように書いたら普通にできました。



ちょっと、この書き方がスマートなのかどうか私にはよくわからんので、もしもっとかっこいい書き方あるよ!ということならぜひ教えてください。

  #sign_in後の飛び先
  def after_sign_in_path_for(resource)
    case resource
    when User
      mypage_path
    when Management
      if current_management.role == Constants::ROLE_A
        managements_a_mypage_path
      elsif current_management.role == Constants::ROLE_B
        managements_b_mypage_path
      end
    end
  end

余談:Constants::ROLE_AとかConstants::ROLE_Bについて

role設定の時に

management.role == management_a

みたいに書いちゃうのは、決め打ちというか、いわゆるマジックナンバー的なものになってしまうと、侍塾の時にメンターさんに教わりました。



そういう奴は定数で管理してあげたほうがいいよ、と。




そこで、appディレクトリの中に、自分でlibフォルダを作って、その中にconstants.rbというファイルを作ってあります。



こちらはmokuで実際にかいたやつ。

f:id:MmRevorution:20190818220624p:plain


なかみはこう。
rails gとかそんなんして無くて、普通に右クリックとか、VSCodeならフォルダやファイル追加のアイコンから作っただけなので、1行目のclass Constantsも自分で書いてます。

f:id:MmRevorution:20190818220823p:plain




PUBLIC_VALUEは、「公開」という文字列で表示されるようになってるけれど、もし「オープン」にしたいなと思ったら。

PUBLIC_VALUE = "公開"

PUBLIC_VALUE = "オープン"

と直すだけで、PUBLIC_VALUEを使っている部分全てが書き換わるわけですな。



定数にしていない場合、該当箇所を全部手で直さなきゃいけないから大変だし、間違って直さなくていいところまで触っちゃうかも。



基本的に、Railsさんはappの中にあるファイルの全てに目を通してくれるんだそうなので、appの中にlibフォルダを作ってます。




おわり!