20200924_アウトプット(devise基本)

アプトプット画像

deviseの基本

deviseとは

ユーザー登録管理機能を簡単に実装するためのgemです。

 

今回は「新規登録」「ログイン」機能の(本当に基本部分だけの)deviseを作成します。

 

前提として、

  • rails 6.0.0を導入済み(一通り”index”のMVC作成とDBのcreate済み)
  • データベースにはシークエルプロを使用

です。

 

おさらい(ライブラリとRubyGemsとGemって何?)

ライブラリとは、プログラミングにおける拡張機能です。複雑なプログラムが1つのセットになっていて、インストールすることで簡単に実装できるようになります。

 

RubyGemsとは、Rubyのライブラリを管理するシステムです。RubyのライブラリのほとんどはRubyGemsに集められています。

 

そして、Gemとは、RubyGemsに集まった、たくさんのGemの一つ一つを指します。今回のdeviseはその中の便利な一つの拡張機能なのです。

 

その1:Gemfileに記入しよう!

使用するには、Gemfileに記入しましょう。 (一番下に書き足す!)

//Gemfile内(一番下)
gem 'devise'

 

その2:Gemfileの更新をしよう!(Gemfile.lock)

Gemfileに記入したあとは、バンドルインストールをします。

バンドルインストールとは、gemに追記した後に、実行すると、そのgemに必要な機能を依存関係を解決した状況で一気にインストールしてくれます。

また、どのようなバージョンでインストールしたかをGemfile.lockに記録してくれます。(素晴らしい!)

なお、追加したGemをアプリケーションに反映させるには、下記コマンド後に、サーバーを再起動する必要があります。

//ターミナル
bundle install

 

 

その3:このアプリケーションで使用できるようにdeviseインストールしよう!

実は、その2の処理だけではこのアプリケーションで使える状況になっていません。

以下を実行して、アプリケーション内に取り入れましょう。(コロン忘れずに!) 

//ターミナル
rails g devise:install

 

その4:モデルを作成しよう!

ここでdeviseならではの注意点です。

普段であれば、「rails g model user」と実行したいところですが、devise機能を自動生成するには、以下のようなコマンドを実行します。

以下のコマンドを実行することで、主に「モデル」「マイグレーションファイル」「ルーティング」が作られます。(ログイン機能なども生成されます)

//ターミナル
rails g devise user(モデル名※単数形だよ!)

 

その5:テーブルを作成しよう!

その4のおかげで、マイグレーションファイルが生成されます。

そして、その中身にはデフォルトで「Email」と「Password」のカラムをすでに記載してくれています!

今回はそのままカラム追加せず、マイグレートします。

//ターミナル
rails db:migrate 

上記を実行すると、カラムが追加されます。(シークエルプロを確認してみてください。)

 

ここでおさらい (テーブル・カラム・レコード・マイグレーションって何?)

テーブルとは、データベースにある1つのカタマリ(単位)です。

テーブルを作成するには、「カラム」といって、エクセルで言うと「見出し」を設定します。(今回で言うと、EmailとPasswordです。)

「カラム」を設定することで、カラムに対応したデータがそこに入っていきます。

(その1行のことをレコードといいます。)

「カラム」について書く場所が「マイグレーションファイル」です。

「カラム」の設定が終わったら「マイグレート」することで、シークエルプロ(パンケーキ)に見出しが設定されます。

 

 

その6:devise用のビューを作成しよう!

さて、indexというホーム画面があったとして、そこに「新規登録」「ログイン」というボタンがあった時、そこをクリックすると、「新規登録」には、Emailとpasswordを入れる欄があって‥と押した先にページが広がっていますよね。

 

deviseをインストールした時には、裏側でそのページを作ってくれるものの、もしその見た目をカスタマイズしたい場合には、自分でターミナルの実行をします。

 

//ターミナル
rails g devise:views (ディレクトリが複数あるので複数形だよ!) 

 上記を実行することで、views内に「devise」というディレクトリ(フォルダ)が現れます。その中に、今回でいうと「新規登録」「ログイン」にあたるファイルがありますので、それを編集すれば、見た目をカスタマイズできます!(今回はしません)

 

  • 新規登録のビューファイルは、registrationsディレクトリのnew.html.erb
  • ログインのビューファイルは、sessionsディレクトリのnew.html.erb

 

です。2つとも、ディレクトリ名は異なるものの、ファイル名は一緒なので、間違えないように気をつけましょう!

 

ここでおさらい (registrationsとsessionsの違いって何?)

結論からいうと、テーブルに保存されるかどうかです。

 

  • 新規登録=registrations(レジストレーションズ)は、ユーザーテーブルに保存される(つまり、新規登録者としてレコードが追加されていく)
  • ログイン=sessions(セッションズ)は、ユーザーテーブルに保存されない(元々ある情報にログインしているだけなので、レコード追加されない)

 

また、それぞれのルーティングは以下のような意味があります。

 

  • registrations#new(ユーザー登録へのパス)
  • registrations#create(ユーザー登録の処理=保存される)
  • registrations#destroy(ユーザー登録の削除の処理=データベースから削除)
  • sessions#new(ログインページへのパス)
  • sessions#create(ログインの処理)
  • sessions#destroy(ログアウトの処理)

 

その7:最後に、deviseならではのヘルパーメソッドを使ってみよう!

 

deviseならではのヘルパーメソッドとして、「user_signed_in?」があります。

(補足)今回は、モデル名が「user」なので、「use~」から始まっています。始め部分はモデル名にします。

 

これは、ログインしているかどうか判断してくれるメソッドです。

 

以下であれば、

  • ログインしていたら「ログアウト」のリンクを表示
  • ログインしていなかったら「新規登録」と「ログイン」のリンクが表示

されるように設定できます。

//index.html.erb
<h1>トップページ<h1>
<% if user_signed_in? %>
ログインしています
<%= link_to "ログアウト", destroy_user_session_path, method:delete%>
<% else %>
<%= link_to "新規登録", new_user_registration_path %>
<%= link_to "ログイン", new_user_session_path %>
<% end %>

その他のポイントとしては、

  • リンク先は「rails routes」で確認
  • ログアウトの時は、「delete」メソッドを指定する。

です。

 

 

こんな形で表示されます!(完成)

完成図

まとめ

今回は、deviseについて理解しました。

上記で解説してきましたが、よりざっくりまとめると、

  1. gemの導入(Gemfileの記入、バンドルインストール)
  2. deviseの導入(rails g devise:install)
  3. モデルの作成(rails g devise user)
  4. テーブルの作成(rails db:migrate)
  5. ビューの作成(rails g devise:views)
  6. ヘルパーメソッドの使用(use_signed_in?)

について理解しました。

 

今まで、RailsのMVCとdeviseのMVCがこんがらがっていたので、頭の整理が出来てよかったです!(かなり、すっきり!)

ベースが理解できたので、これを元にカラムを追加したり、他のヘルパーメソッドをビューに取り入れてみたり、活用していきます。

 

理解が浅いところ(つみ残し)

 

  • ヘルパーメソッド(フォーム)→解決!(deviseのことをちゃんと理解していなかったことが判明。)
  • ハッシュ・シンボルの概念
  • タグ・セレクタ・id
  • ログアウトの時だけ、「httpメソッド」が「delete」されること。

 

感想

 

このdeviseがHTMLにおけるフォームと混ざり、railsのMVCと混ざり、よく理解できていなかったので、どこまでがRailsの役割で、どこからがdeviseなのか理解できてよかったです!

 

今日は筋トレした後に勉強しました。

いつもより集中できた気がします。