deviseを利用した新規登録時のユーザー情報の保存とフラッシュメッセージについて

## はじめに
deviseを利用したuser周りの設定の中で、私が困ったことについて解決方法を記述しようと思います。

今回なかなか思った通りにできずに困ったことはユーザーの新規登録です。新規登録ページの作成はできましたが、そこから先で躓いてしまいました。

- 登録したい新規ユーザーの情報が登録されない
- 新規登録ページで情報入力後、ボタンを押してもページが変わらない
- 新規登録ができた場合とできなかった場合の動作を変えたい
- 新規登録時のフラッシュメッセージの表示がされない

以上を解決した方法について備忘録として記事を書きました。

Rails 5.2.4.4
Ruby 2.5.1
を使用しています。


## ルーティングの設定
最初に躓いたのはユーザー情報が保存されないことです。sendボタンを押すとそのまま動かなくなり、Sequel Proを確認しても情報の保存がされていませんでした。

ルーティングとコントローラーに問題があると考えたので、まずはroutes.rbを確認します。

現状ではおそらく既にご自身で設定したトップページなどへのルーティングと、devise導入時に自動で記述されたコードで以下のようになっていると思います。

```ruby:config/routes.rb
devise_for :users

root "トップページ"
resources :その他のページ
```

ここに追記をしていきます。
新規登録はdeviseで自動生成されたregistrationsにあたるので以下のように記述をします。新規登録には関係ありませんが、ついでにログインに必要なsessionsについても記述しておきましょう。また、resources :usersという記述も追加します。

```ruby:config/routes.rb
devise_for :users, controllers: {
  registrations: 'users/registrations',
  sessions: 'users/sessions'
} 

root "トップページ"
resources :その他のページ
resources :users
```

## コントローラーの設定

次にコントローラーを確認します。

registrations_controller.rbを開きます、こちらはdeviseで自動生成されたファイルです。
中を見ると class ~ end の中身が全てコメントアウトされているのが確認できます。こちらにコードを記述をしていきます。

今回やりたいことはユーザー新規登録なので、newとcreateを記述します。

```ruby:app/controllers/uses/registrations_controller.rb
def new
  @user = User.new
end

def create
  @user = User.new(user_params)
  if @user.save
    redirect_to root_path
  else
    render :new
  end
end
  
private

def user_params
  params.require(:user).permit(:email, :password, :password_confirmation)
end
```

createの中では複数のことをしているので注意点の記述や解説をします。

まず

```ruby:app/controllers/uses/registrations_controller.rb
@user = User.new(user_params)
```
この(user_params)についてははprivate以下で記述しています。

```ruby:app/controllers/uses/registrations_controller.rb
def user_params
  params.require(:user).permit(:email, :password, :password_confirmation)
end
```
このpermitの後の部分では新規登録時に必要なカラムを記述します。例えば私の場合はニックネームも登録できるようにしたかったので、以下のように記述をしました。

```ruby:app/controllers/uses/registrations_controller.rb
def user_params
  params.require(:user).permit(:nickname, :email, :password, :password_confirmation)
end
```

今回はニックネーム・メールアドレス・パスワード・確認用に再入力するパスワードの４つのカラムを記述してあります。
ご自身の登録したい情報によって記述を変更してください。

次の記述です。

```ruby:app/controllers/uses/registrations_controller.rb
if @user.save
  redirect_to root_path
else
  render :new
end
```
この記述は新規登録ができた場合とできなかった場合の条件分岐をしています。
こちらでは登録ができた場合はトップページへ飛び、できなかった場合にはまたユーザー新規登録ページへと戻ってくるように記述しています。

redirect_to と render は似たような動きをしますが使い分けが必要です。こちらの記事がとてもわかりやすく解説されているので、気になる方は目を通してみると勉強になると思います。
https://qiita.com/morikuma709/items/e9146465df2d8a094d78

ここまでで以下の問題が解決しました。

- 登録したい新規ユーザーの情報が登録されない
- 新規登録ページで情報入力後、ボタンを押してもページが変わらない
- 新規登録ができた場合とできなかった場合の動作を変えたい

新規登録ページから情報を入力して登録ができること、登録が失敗した場合にはまた新規登録ページに戻ってくることを確認してください。問題なく行えていれば成功です。

しかし今のままでは新規登録が成功してもトップページに飛ぶだけなので、ちゃんと登録ができたのかユーザーにはとてもわかりにくい状態です。
最後にフラッシュメッセージを表示できるようにします。

## フラッシュメッセージを表示する

deviseでは設定をすれば簡単にフラッシュメッセージを表示できます。
こちらの記事がフラッシュメッセージの導入方法についてわかりやすく解説してあります。
https://qiita.com/hari00702/items/4e100b9dc78d19e8e316

しかし、ユーザー新規登録時の登録完了のメッセージはその中には入っていません。
そこでregistrations_controller.rbのcreateに以下のように追記します。

```ruby:app/controllers/uses/registrations_controller.rb
def create
  @user = User.new(user_params)
  if @user.save
    redirect_to root_path, notice: 'ユーザー新規登録を完了しました' #追記
  else
    render :new
  end
end
```

notice: の後ろの部分の記述がそのままフラッシュメッセージになるので好みのメッセージを入れてください。
新規登録ページから実際に登録を行ってみて、ページ上部にメッセージが表示されていれば成功です。

これで残りの

- 新規登録時のフラッシュメッセージの表示がされない

についても解決できました。



## 参考
https://qiita.com/mmmasuke/items/7d5c47b4a40f6912adf2