新規登録画面実装② devise 新規登録の項目追加　別モデルから取得

<h2>やりたいこと</h2>
devise導入済みです。
①の記事では、userモデルのカラムを
deviseの新規登録画面に表示、登録できるようにしましたが、
今回は別モデルであるDepartment（部署）を登録したいです！
３時間程戦いました・・・。

https://qiita.com/ki_87/items/3277e7bc8da28b33cbb6


departmentとuserの関係は、1:Nにしてます。
（userは１つの部署に所属。部署は複数のuserを持つ）

![スクリーンショット 2021-08-01 12.05.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/7e574e97-5250-ef8f-3cdc-3c2a6c19b8e5.png)

<h2>modelファイルにアソシエーション</h2>

ここら辺はなんてこと無く出来ました。

```perl:models/user.rb
belongs_to:department
```

```perl:models/department.rb
 has_many:users, dependent: :destroy
```

<h2>マイグレーションファイル</h2>

```rb
class CreateDepartments < ActiveRecord::Migration[5.2]
  def change
    create_table :departments do |t|
      t.string :name,null: false    　　#表示名
      t.string :correct_name         #正式名称

      t.timestamps
    end
  end
end
```

部署名は、会社によっては長くなりがちで、、あまり長いと厄介なので、
表示名と正式名称でカラムを分けました。

```rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
省略
t.integer :department_id,null:false
省略
```

department_idは外部キーです。

<h2>部署idを登録させる　　Applicationコントローラー</h2>

```rb
class ApplicationController < ActionController::Base
  # ユーザー認証などが行われる前に、configure~が実行される
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    # デフォルトにないname/join_year/部署を追加しているので、それらを許可するよう記載している
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name,:join_year,:department_id])
  end

end
```
ちゃんとdepartment_idを受け取って保存するように指示します。

<h2>新規登録画面に入力フォームを追加</h2>

```erb
  <div class="form-group">
    <%= f.label:"所属先" %><br />
    <%= f.collection_select(:department_id, @departments, :id, :name, class: "form-control") %>
  </div>
```
<h6>これで、完成！！！！だと思ってました...。</h6>
しかしこれだと@departmentsを渡せてないので、
```undefined methodmap' for nil:NilClass```というエラーが出てきます。
<h6>どこに@departmentsの値を定義すれば・・・・？</h6>

<h2>@departmentsの値を定義する</h2>

<h6>controllers/users/registrations_controller.rb</h6>に書きます！
あることに気づかず、rails g devise:controllers usersをやってしまいました。
（無ければ、rails g devise:controllers usersで、コントローラー作れます）

```rb
class Users::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]

def new
  @user = User.new
  @departments = Department.all
end
省略
```

<h2>ルーティングを直す</h2>

上記のコントローラーを通過してビューを表示してほしいので、ルーティングを直します。

```rb:routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'users/registrations' }
  # devise_for :users　　←元々はコレだった
```

<h2>マイページでの部署の表示</h2>

```erb:users/show/html.erb

省略
 <div style="text-align:center;"><%=link_to departments_path do %><%= user.department.name %><% end %></div>
  <div style="text-align:center;"><%= user.name %></div>
省略
```

<h2>完成！</h2>

無事に部署の登録、マイページでの表示に成功しました！！

![スクリーンショット 2021-08-01 12.55.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/170357d0-f3e2-2459-e5d2-c5f6b2f2dbe3.png)

<h2>問題発生</h2>
このままだとおそらくデバイスのエラーメッセージが出力されないのではないかと思います・・・・

https://qiita.com/ki_87/items/035e1f2e38ce94b7cc7a

③の記事でエラー解消しています。

<h2>参考にさせていただいた記事</h2>

ありがとうございます！この記事のおかげでなんとか実装できました！



https://qiita.com/wonder_meet/items/9238d9bedea542ab975b