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

deviseの使い方

More than 1 year has passed since last update.

deviseの使い方

1, インストール方法

gemfiledeviseを記述

$ bundle install

2, ファイルの生成

$ Rails g devise:install で初期ファイルの生成

3, ユーザーモデルの作成

$ Rails g devise User (モデル名) でモデルの作成

$ Rails db:migrate でマイグレートする

4, viewファイルの生成

$ rails g devise:views でディレクトリをアプリ内に表示させる

5, フォームの作成

form_for()の定型引数<%= form_for(resources, as:resource_name, url: regestration_path(resource_name)) %>

url:のあとは新規登録、ログインなどで使い分ける

【主な使い方、知識】

カラムの追加

  • 最初は:nameカラムがない。migration.fileに記述して、追加を行う
db/migrate/YYYYMMDDHHMMSS_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at
      ## Rememberable
      t.datetime :remember_created_at
      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip
      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable
      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_at

      t.string :name                  #ここを追加
      t.timestamps null: false
    end
    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end

deviseモジュールの説明

【デフォルトの機能】

module 機能
database_authenticatable DBに保存するパスワードの暗号化(必須)
registerable サインアップ処理
recoverable パスワードリセット
rememberable クッキーにログイン情報を保持
trackable サインイン回数・時刻・IPアドレスを保存
validatable メールアドレスとパスワードのバリデーション

【コメントアウトにより、追加可能な機能】

module 機能
confirmable メール送信による登録確認
lockable 一定回数ログインに失敗した際のアカウントロック
timeoutable 一定時間でセッションを削除する
omniauthable OmniAuthサポート

【モジュール詳細】

機能 概要
database_authenticatable サインイン時にユーザーの正当性を検証するためにパスワードを暗号化してDBに登録します。認証方法としてはPOSTリクエストかHTTP Basic認証が使えます。
registerable 登録処理を通してユーザーをサインアップします。また、ユーザーに自身のアカウントを編集したり削除することを許可します。
recoverable パスワードをリセットし、それを通知します。
rememberable 保存されたcookieから、ユーザーを記憶するためのトークンを生成・削除します。
trackable サインイン回数や、サインイン時間、IPアドレスを記録します。
validatable Emailやパスワードのバリデーションを提供します。独自に定義したバリデーションを追加することもできます。
confirmable メールに記載されているURLをクリックして本登録を完了する、といったよくある登録方式を提供します。また、サインイン中にアカウントが認証済みかどうかを検証します。
lockable 一定回数サインインを失敗するとアカウントをロックします。ロック解除にはメールによる解除か、一定時間経つと解除するといった方法があります。
timeoutable 一定時間活動していないアカウントのセッションを破棄します。
omniauthable intridea/omniauthをサポートします。TwitterやFacebookなどの認証を追加したい場合はこれを使用します。

カラムの追加を行った場合にすること

前提に、カラムの追加(rails db:migrate)を行っている
application_controller.rbのファイルに以下を記述

application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  # 以下を記述
  before_action :configure_permitted_parameters, if: :devise_controller?

   protected

     def configure_permitted_parameters
       #以下の:name部分は追加したカラム名に変える
       devise_parameter_sanitizer.permit(:sign_up, keys: [:name]
     end

end

【以下説明】
before_action :configure_permitted_parameters, if: :devise_controller?
deviseを利用する機能(ユーザ登録、ログイン認証など)の場合、configure_permitted_parametersを実行します。

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

configure_permitted_parametersが実行されると、devise_parameter_sanitizer.permitでnameのデータ操作を許可するアクションメソッドを指定します。今回の場合、ユーザ登録(sign_up)の際、ユーザ名(name)のデータ操作が許可されることになります。ストロングパラメーター。

routesパスの説明

  • devise/session#

    • ログイン機能
  • devise/refistrations#

    • 登録機能

ログインかを確認するメソッド

user_signed_in? ログイン中はtrueを返す

 ログイン中のユーザーの情報メソッド(session)

current_userに格納してある
例:

rails.controller
def create
   @post_image = PostImage.new
   @post_image.id = current_user.id
   @post_image.save  
end

全てのページでログイン認証を儲けるコード

アクセス時に認証を必要とする

app/controllers/application_controller.rb
   class ApplicationController < ActionController::Base
      before_action :authenticate_user!
   end

ログインしていると表示可能。ログイン認証されていなければrootパスへリダイレクトする

ログイン時に別のカラムで認証する

config/initializer/devise.rbに以下を記述

config.authentication_keys = [:name] # :nameを認証可能にしたいカラム名に変更

 ログイン、ログアウト直後のリダイレクト先を変更

app/controllers/application_controller.rbに以下を記述

# サインイン後のリダイレクト先をマイページへ
    def after_sign_in_path_for(resource)
        flash[:notice] = "ログインに成功しました" #  <-任意で
        user_path(current_user.id)  # 指定したいパスに変更
    end

    # サインアウト後のリダイレクト先をトップページへ
    def after_sign_out_path_for(resource)
        flash[:alert] = "ログアウトしました"
        top_path
    end

エラーメッセージの表示方法

ファイル.html.erbないの表示したい場所に<%= devise_error_messages! %>を表記する

参照元

deviseまとめ
deviseまとめ(複雑)

salvage0707
よろしくお願いします!
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした