Help us understand the problem. What is going on with this article?

deviseを使ったログイン機能 学んだ事まとめ

More than 1 year has passed since last update.

学んだことを追記していきます。備忘録。

devise(Gem)導入方法。

【参考】
Rails deviseで使えるようになるヘルパーメソッド一覧
githubのreadme

user_signed_in?メソッドで、ユーザーがサインインしているかどうか判別したりする。

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

①deviseの設定ファイルを作成

$ rails g devise:install
ファイル名 役割
config/initializers/devise.rb deviseに関する設定が記述されています。初期設定からカスタマイズする際に編集します。
config/locales/devise.en.yml バリデーション時エラーメッセージなどが設定されています。デフォルトでは全て英語になっています。

②rails g deviseコマンドでuserモデルを作成

$ rails g devise user

この時、下記4ファイルが新規作成される
app/models/user.rb
db/migrate/2014XXXXXXXXXX_devise_create_users.rb
test/fixtures/users.yml
test/models/user_test.rb

③rake db:migrateを実行。
これでphpMyAdminにuserテーブルができている筈。

$ rake db:migrate

configure_permitted_parametersメソッド

deviseでは初期状態でサインアップ時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターが設定してあるので、追加したキーのパラメーターは許可されていません。追加のパラメーターを許可したい場合は、application_controllerにおいてbefore_actionconfigure_permitted_parametersメソッドを設定します。
例えば、ユーザー名も一緒に登録したい等。

【例】

ApplicationController.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:ストロングパラメーターを追加したいアクション名, keys: [:追加するキー])
  end
end

current_userヘルパーメソッド

deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができます。これは、現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッドです。

after_sign_out_path_forメソッド

deviseでサインアウトしたあとのリダイレクト先を指定するメソッドとしてafter_sign_out_path_forがあります。このメソッドでは返り値にサインアウト後のリダイレクト先URLを指定します。deiviseのメソッドを上書きしている関係上resourceを引数に渡さなけらばならないので、resourceを引数に渡します。

【例】

application_controller.rb
def after_sign_out_path_for(resource)
    '/users/sign_in' # サインアウト後のリダイレクト先URL
  end

authenticate_user!メソッド

deviseをインストールすると、ログイン画面とサインアップ画面を自動で用意してくれます。authenticate_user!はdeviseをインストールすることで使えるメソッドです。ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトします。通常、before_actionと合わせて使用します。before_actionのexceptやonlyオプションを組み合わせると、特定のアクションを指定することもできます。

topcontroller.rb
class TopController < ReviewController
  before_action :authenticate_user!, except: :index

  def index
    @tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
  end

  def create
    Tweet.create(image: params[:image], text: params[:text], user_id: current_user.id)
  end

devise_parameter_sanitizerメソッド

devise_parameter_sanitizerメソッドを使うと、deviseで設定されているstrong_parametersに対してパラメーターを追加することができます。

devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])

devise_parameter_sanitizerメソッドで指定する引数は2種類あります。

  • 1つ目が「strong_parametersを追加したい処理の種類」です

  • 2つ目の引数には追加したいパラメーター名を渡します。複数のパラメーターを送る場合は,(カンマ)区切りで渡します。

rails g devise:views

deviseはgemをインストールしただけで、ログイン画面や、新規登録画面が用意されます。
※これらの画面は、deviseのgemの中に記述されているためアプリケーション内で見つけることはできません。

しかし、ほとんどの場合オリジナルでHTMLをカスタマイズして使うケースが多いため、
rails g devise:viewsコマンドでビューファイル群を生成します。

GREAT__SHARK
日々の開発のちょっとしたメモとして記事を書いてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away