Railsでdeviseを使うときに設定すること【超初心者】

自分用。練習用に作るときに設定することの備忘録。

<h2>目次</h2>
1.導入
2.ユーザーテーブルの作成
3.マイグレーションファイルの編集
4.コントローラへの記述追加
5.devise.rbの記述追加
6.ルートに記述追加
7.ログイン画面を編集する
8.ログアウト機能を作る
9.サインイン画面を編集する

<h1>1.導入</h1>
deviseをインストールするためGemfileにdeviseを記載

```rb:Gemfile
gem 'devise'
```
ターミナルにてインストール

```rb:tarminal
$ bundle install
$ rails g devise:install
```

<h1>2.ユーザーテーブルの作成</h1>

```rb:tarminal
$ rails g devise User
```
Userがモデル名

<h1>3.マイグレーションファイルの編集</h1>
追加することがあれば追加する。id,password,emailは標準装備。今回はname,age,gender,introduction,profile_image_idを追加する

```rb:db/migrate/202102~~01_devise_create_users.rb
(略)
# t.datetime :locked_at
      t.string :name
      t.integer :age
      t.integer :gender
      t.text :introduction
      t.string :profile_image_id #ここまで追加
      t.timestamps null: false
    end
(略)
```
そしたらターミナルで```rails db:migrate```を行う

<h1>4.コントローラへの記述追加</h1>
before_action :authenticate_user!はexceptで記述したものだけ通す。onlyは他で使うexcept効果（？）

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate_user!, only: [:top, :index, :show]
  before_action :configure_permitted_parameters, if: :devise_controller?

  def after_sign_in_path_for(resource)
    ログイン後に遷移させたい所_path
  end

  def after_sign_out_path_for(resource)
    ログアウト後に遷移させたい所_path
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  endend
```
<h1>5.devise.rbの記述追加</h1>
ログイン時に必要な項目を変えたい場合に変更。変更しなくても使える。

```rb:config/initializers/devise.rb
49行目ぐらい
  # You can also supply a hash where the value is a boolean determining whether
  # or not authentication should be aborted when the value is not present.
  # config.authentication_keys = [:email]

これをコメントアウトを外してemailを変える
 　connfig.authentication_keys = [:name]
```
<h1>6.ルートに記述追加</h1>
順番に注意！順番を間違えるとエラーになったり無限に繰り返したりする。

```rb:config/routes.rb
  devise_for :users
  root to: 'homes#top'
```

<h1>7.ログイン画面を編集する</h1>

```console:tarminal
$ rails g devise:views
```
出来たら勝手にできたログイン(サインイン)画面を編集

```erb:app/views/devise/registrations/new.html.erb
<%= form_with model: @user, url: user_session_path, local: true do |f| %> #変更

  <div class="field"> #追加
    <%= f.label :name %>
    <%= f.text_field :name, autofocus: true %>
  </div>
(略)
```
<h1>8.ログアウト機能を作る</h1>

```erb:置きたいところ.erb
  <body>
    <% if user_signed_in? %>
      <li>
        <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
      </li>
　　　#追加したいものを書く
    <% else %>
      <li>
        <%= link_to "新規登録", new_user_registration_path %>
      </li>
      <li>
        <%= link_to "ログイン", new_user_session_path %>
      </li>
　　　#追加したいものを書く
    <% end %> 
    <%= yield %>
  </body>

```
<h1>9.サインイン画面を編集する</h1>
合ってるか不安

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

<%= form_with model: @user, url: user_registration_path, id: 'new_user', class: 'new_user', local: true do |f| %> #編集
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field"> 
    <%= f.label :name %>
    <%= f.text_field :name, autofocus: true %>
  </div>
  <div class="field">
    <%= f.label :email %>
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>
  <div class="field">
    <%= f.label :age %>
    <%= f.number_field :age, autofocus: true, min: 1, max: 100 %>
  </div>
  <div class="field">
    <%= f.label :gender %>
　　<%= f.select :gender, [ ["男性",1], ["女性", 2], ["未選択", 3 ] , prompt: "性別を選択" %>
(略)
```

とりあえずこれで一通り。
記録をし忘れているところがあったら編集していく所存。
間違えていないか不安なので見直す。