Rails devise導入　手順

Railsの便利なGem、『devise』。
ユーザーの登録などのユーザー管理全般を簡単に実装してくれるGemです。
今回は<b>『ユーザー登録時に名前、メアド、パスワードが登録出来て、サインインする時にメアドとパスワードを必要とする』</b>という超絶シンプルなユーザー管理システムを作る事にします。
初めからていねいに解説しますね。

# まずはGemを導入

```ruby:Gemfile
gem 'devise'
```

しっかりと一番下に書いてあげて下さい。
開発環境でも本番環境でも使うからです。

### インストールする
```terminal:ターミナル
$ bundle install
```

# Userモデルを作る
普通の『rails g model user』とは一味違うので注意！
しっかり、devise専用のモデル作成方法があります。

```terminal:ターミナル
$ rails g devise:install #設定ファイルの作成
$ rails g devise user #Userモデルの作成
```

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

そしたら、rails g devise userでUserモデルを作りましょう。これでUserモデルが出来ます。
楽勝ですね！

次にマイグレーションファイルをいじって下さい。

```ruby:マイグレーションファイル
class DeviseCreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,               null: false ##nameを追加！！！！！！！！
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

# 〜省略〜
```

t.string :nameを追加してあげて下さい。deviseはデフォルトだとメールアドレスとパスワードしかないので。
名前いらないよって方は飛ばしてmigrateしちゃって下さい。

```terminal:ターミナル
$ bundle exec rake db:migrate
```

#ログイン・サインアップ画面を作る

deviseでログイン機能を実装すると、ログイン・サインアップ画面は自動的に生成されますがビューファイルとしては生成されません。これは、deviseのGem内に存在するビューファイルを読み込んでいるためです。

ビューファイルに変更を加えるためには、deviseのコマンドを利用してビューファイルを生成する必要があります。

```terminal:ターミナル
$ rails g devise:views
```

これで新たにビューファイルが生成されました。

サインアップ画面は
app/views/devise/registrations/new.html.erb、
ログイン画面のビューは
app/views/devise/sessions/new.html.erbという
ビューファイルが対応しています。

# ファイルを編集する

まずは、サインアップ画面から！

```ruby:app/views/devise/registrations/new.html.erb
  <div class="contents row">
    <h2>Sign up</h2>
    <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
      <%= devise_error_messages! %>

      <div class="field">
        <%= f.label :nickname %> <em>(6 characters maximum)</em><br />
        <%= f.text_field :nickname, autofocus: true, maxlength: "6" %>
      </div>

      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email %>
      </div>

      <div class="field">
        <%= f.label :password %>
        <% if @validatable %>
        <em>(<%= @minimum_password_length %> characters minimum)</em>
        <% end %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>

      <div class="field">
        <%= f.label :password_confirmation %><br />
        <%= f.password_field :password_confirmation, autocomplete: "off" %>
      </div>

      <div class="actions">
        <%= f.submit "Sign up" %>
      </div>
    <% end %>
  </div>

```

次に、ログイン画面を！


```ruby:app/views/devise/sessions/new.html.erb
  <div class="contents row">
    <h2>Log in</h2>

    <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>

      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email, autofocus: true %>
      </div>

      <div class="field">
        <%= f.label :password %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>

      <% if devise_mapping.rememberable? -%>
        <div class="field">
          <%= f.label :remember_me %><br />
          <%= f.check_box :remember_me %>
        </div>
      <% end -%>

      <div class="actions">
        <%= f.submit "Log in" %>
      </div>
    <% end %>
  </div>

```

これはあくまでも例なので、ご自分でやりたいように編集して下さい。

# ストロングパラメータを編集する
サインアップ時に入力する情報はパラメーターとしてサーバーに送信されます。
これ、通常のリクエストの場合は、コントローラに記述してあるストロングパラメーターで受け取れるパラメーターを制限すればいいんですけど、
deviseでログイン機能を実装した場合のパラメーターの受け取り方は通常とは異なるのが厄介なんですよね、、

というのも、ログイン時に送られてくるパラメーターを制限するストロングパラメーターは、deviseのGem内に記述されているため編集することはできないからです。

じゃあどうすんの？って話になるのですが、安心して下さい。

今回追加したニックネームを受け取れるようにするにはdeviseがメソッドを提供してくれてます。

```ruby:app/controllers/application_controller.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(:sign_up, keys: [:nickname])
    end
  end

```

 configure_permitted_parametersメソッドを追加してあげて下さい。これでサインアップ時に名前を登録出来るようになりました。
before_actionのところは、deviseのコントローラが動いた時のみ、configure_permitted_parametersを呼ぶようにしてます。
というのも、devise_parameter_sanitizerはdeviseコントローラ以外で使う事が出来ないメソッドだからです。
もし書かないと、これapplication_controllerなので他のコントローラでも呼ばれちゃいます。

# パス、ルーティングの設定
ルーティングとコントローラもしっかり整備しましょう。
まずはパスから。（自分のビューに合わせてやって下さい）

```ruby:index.html.erb
 <div class="grid-6">
   <%= link_to "ログイン", new_user_session_path, class: 'post' %>
   <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
 </div>
```
　new_user_sessin_pathはPrefixと呼ばれる、ルーティングのパスが入る変数の事です。URLが代入してある文字っていう風に考えて下さい。
語尾に『path』を付けてあげるのを忘れずに！
例：new_user_session_path ＝　”/users/sign_in”

これで、ルーティングに行きますね。

```ruby:config/route.rb
Rails.application.routes.draw do
  devise_for :users #勝手に書いてくれてるのでそのままに
end
```

なんと、deviseは勝手にルーティングを書いてくれます。助かりますね。


終了です！！

# ありがとうございました！