deviseでログイン機能を追加する

## Ruby On Railsでdeviseを扱う

### deviseの導入
```ruby:Gemfile
gem 'devise'
```

```ruby:ターミナル
bundle install
rails g devise:install
```

### ファイルを作成
```ruby:ターミナル
# model
rails g devise user
rails db:migrate
# controller
rails g devise:controllers users
# views
rails g devise:views users
```

### 複数のログイン機能を作成する場合
#### 必要な分だけファイルを用意する
```ruby:ターミナル
# user用
rails g devise user
rails db:migrate
rails g devise:controllers users
rails g devise:views users

# staff用
rails g devise staff
rails db:migrate
rails g devise:controllers staffs
rails g devise:views staffs
```
#### 設定ファイルを変更する
```ruby:config/initializers/devise.rb
 # config.scoped_views = false
 # ↑コメントアウトを外してtrueにする
 config.scoped_views = true
```

#### ファイルについて
```
app/views/users/sessions/new.html.erb:       ログイン画面
app/views/users/registrations/new.html.erb:  新規登録画面
```

#### seedで管理者管理者を作成する
```ruby:ターミナル
rails g devise adimn
rails db:migrate
rails g devise:controllers admin
rails g devise:views admin
```
```ruby:db/seeds.rb
Admin.find_or_create_by(id: 1) do |admin|
  admin.email = "example@example.com"
  admin.password = "foobar"
end
```
```ruby:ターミナル
rails db:seeds
```

### ログアウトする
```erb:erb
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "ログアウト", destroy_medicalstaff_session_path, method: :delete %>
```

### :authenticate_user!
deviseで使える便利なメソッド
ユーザがログインしているかどうかを確認し、ログインしていない場合はユーザをログインページにリダイレクトする。

```ruby:controller.rb
class UsersController < ApplicationController
  # befor_actionと一緒に使う
  before_action :authenticate_user!

  def index
    @user = User.find(current_user.id)
    favorites = Favorite.where(user_id: current_user.id).pluck(:institution_id)
    @favorites_list = Institution.find(favorites)
  end

  def edit
    @user = User.find(current_user.id)
  end

  def update
    @user = User.find(current_user.id)
    if @user.update(user_params)
      redirect_to edit_user_path(current_user), notice: "プロフィール情報を更新しました"
    else
      render "edit"
    end
  end

  private
  def user_params
    params.require(:user).permit(:name, :image)
  end
end
```

### 日本語化
#### devise.ja.ymlを使う
devise.ja.ymlをconfig/localesに設置します。devise.ja.ymlはいくつか見本があるようです。
[①](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml) [②](https://github.com/Junsuke/miscellaneous/blob/master/devise.ja.yml) [③](https://gist.github.com/yhara/606476)
``local/appricarion.rb``に``config.i18n.default_locale = :ja``を記述して、日本語設定をする。

```ruby:config/application.rb
module Sample  #module名はわかりやすいものを
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end
end
```
#### gemを導入する
```ruby:Gemfile
gem 'rails-i18n'
```
```ruby:ターミナル
bundle install
```

## 参考資料
[heartcombo/devise](https://github.com/heartcombo/devise)
[【Rails】deviseを導入してみる](https://qiita.com/Hal_mai/items/350c400e8763ce0487a3)
[[*Rails*] deviseの使い方（rails6版）](https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e)
[Rails deviseで使えるようになるヘルパーメソッド一覧](https://qiita.com/tobita0000/items/866de191635e6d74e392)
[【Rails】deviseのビューのform_forをform_withに置き換える](https://qiita.com/wonder_meet/items/fac07af1edcd79ad102a)

### 複数のログイン機能を作成する場合
[Railsのdeviseを使って複数のユーザー別でログインする方法](https://qiita.com/Densetsu/items/2dc6a010809ae70c079e)
[deviceを使用して、adminモデルを追加する流れを分かりやすく解説](https://note.com/yukinooffice/n/na551c0f4e52c)

### :authenticate_user!
[【rails】authenticate_user!の使い方](https://qiita.com/gogotakataka1234/items/c7d5c0b3d8953216259e)

### 日本語化
[【Rails基礎】deviseを用いたフラッシュメッセージを表示する方法を簡単に解説](https://techtechmedia.com/flash-messages-rails/)
[【Rails】deviseを利用したflashメッセージの表示方法](https://qiita.com/mikan3rd/items/ca783769c959a16cc999)