Rails:gem 'devise' の使い方



gem 'devise' の使い方を復習していく。

'devise'のgemはrailsでログイン機能を簡単に実装するためのgem。

Gemfileを以下の様に編集

Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

# 省略

gem 'devise'      #最終行に追記。


$ pwd ディレクトリを確認する。
$ bundle install Gemfileに追記したdeviseをインストール。
*ログに(Installing devise 4.7.0)みたいなのが出ていればインストールできている。

ローカルサーバーの再起動

control + C で一度サーバー終了
$rails s で再度サーバー起動

deviseの設定ファイル作成

deviseの使用するためには、Gemのインストールと専用コマンドを使用して
設定ファイルを作成する必要がある。

$rails g devise:install 設定ファイルの作成

新規作成されるファイル
• config/initializers/devise.rb
• config/locales/devise.en.yml

deviseの機能を持ったモデルの作成

モデルの作成には通常のコマンドではなく、deviseのモデルを作成する
専用のコマンドを使用してモデルを作成する。

$ rails g devise user userモデルを作成する。

新規作成されるファイル
• app/models/user.rb
• test/fixtures/users.vml
• test/models/user_test.rb
• db/migrate/20XXXXXXXXXXXX_devise_create_users.rb

config/routes.rbに下記の様な記述が自動的に追記される。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users   #この部分が追記される
# 省略

$ rails db:migrate usersテーブルの作成。

Viewの作成

deviseでログイン機能を実装するとuser_signed_in? メソッドが使用できる。
ユーザーがサインインしている時はtrueを返して、サインインしていない時はfalseを返す。
user_signed_in? メソッドを使用して、ログイン・新規登録・ログアウトボタンを作成していく。

sample.html.erb
<% if user_signed_in? %>
  # ログインしている時の処理
<% else %>
  # ログインしていない時の処理
<% end %>

下記の様にボタンを適当なviewに追記。

sample.html.erb
<div class="header">
  <% if user_signed_in? %>
    <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__btn" %>
  <% else %>
    <%= link_to "ログイン", new_user_session_path, class: "header__btn" %>
    <%= link_to "新規登録", new_user_registration_path, class: "header__btn" %>
  <% end %>
</div>

次にdevise用のviewを作成する。

$ rails g devise:views 専用コマンドでログイン画面・新規登録画面が作成される。

新規作成されるファイル
• app/views/devise以下のディレクトリにある各種ビューファイル。

新規登録画面: app/views/divise/registrations/new.html.erb

ログイン画面: app/views/devise/sessions/new.html.erb

再度ローカルサーバーを再起動して動作確認して終了。


configure_permitted_parameters メソッド

deviseはデフォルトで、メールアドレス・パスワードしか受け取れない様にストロングパラメーターが設定されている。
configure_permitted_parameters メソッドを設定して、追加のパラメーターを許可しなければならない。

つまり、初期状態だと新規登録画面でメールアドレスとパスワードしか登録できない。
ニックネームやその他の情報を登録したかったら設定をいじる必要がある。

ニックネームを登録できる様にする

まずはusers テーブルにnicknameカラムを追加する。

$ rails g migration AddNicknameToUsers nickname:string
$ rails db:migrate

新規登録画面で nickname を登録できる様にする。

app/views/devise/registrations/new.html.erb
<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

# 以下を追記
  <div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname, autofocus: true %>
  </div>

# 省略

configure_permitted_parameters メソッドの設定

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end

動作確認して終了。