[Rails] deviseの導入手順


手順1

Gemfile
gem 'devise'
ターミナル
$ bundle
$ rails g devise:install
#これをすると以下のようになる

===============================================================================
Some setup you must do manually if you haven't yet:
  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:
       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
     In production, :host should be set to the actual host of your application.
  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:
       root to: "home#index"
  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:
       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>
  4. You can copy Devise views (for customization) to your app by running:
       rails g devise:views
===============================================================================

手順2

・ビューの作成

ターミナル
$ rails g devise:views

・Userモデルの作成

ターミナル
$ rails g devise User
# この時にmigrationファイルが作成されるのでusersテーブルに追加したいカラムを記述すると良い。
# 今回はnameカラムを追加するとする。

$ rails db:migrate

手順3

手順2で追加したnameカラムを使用できるように設定します。

app/controllers/application_controller.rb

application_controller.rb
class ApplicationController < ActionController::Base
  #このコードがあると、Railsで生成されるすべてのフォームとAjaxリクエストにセキュリティトークンが自動的に含まれます。セキュリティトークンがマッチしない場合には例外がスローされます。(Railsガイド)
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  #configure_permitted_parametersはストロングパラメータを設定するメソッド。
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end

基本的な操作は以上。

番外編

ユーザー編集をパスワード無しで行う。

registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  protected

  def update_resource(resource,params)
    resource.update_without_password(params)
  end
end

上のコードを使うにはroutingを変更しないといけない。

routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: "registrations" }
end