LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-08-01

やりたいこと

devise導入済みです。
①の記事では、userモデルのカラムを
deviseの新規登録画面に表示、登録できるようにしましたが、
今回は別モデルであるDepartment(部署)を登録したいです!
3時間程戦いました・・・。

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

スクリーンショット 2021-08-01 12.05.25.png

modelファイルにアソシエーション

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

models/user.rb
belongs_to:department
models/department.rb
 has_many:users, dependent: :destroy

マイグレーションファイル

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

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

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

department_idは外部キーです。

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

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を受け取って保存するように指示します。

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

  <div class="form-group">
    <%= f.label:"所属先" %><br />
    <%= f.collection_select(:department_id, @departments, :id, :name, class: "form-control") %>
  </div>
これで、完成!!!!だと思ってました...。

しかしこれだと@departmentsを渡せてないので、
undefined methodmap' for nil:NilClassというエラーが出てきます。

どこに@departmentsの値を定義すれば・・・・?

@departmentsの値を定義する

controllers/users/registrations_controller.rb
に書きます!
あることに気づかず、rails g devise:controllers usersをやってしまいました。
(無ければ、rails g devise:controllers usersで、コントローラー作れます)
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
省略

ルーティングを直す

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

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

マイページでの部署の表示

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>
省略

完成!

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

スクリーンショット 2021-08-01 12.55.57.png

問題発生

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

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

参考にさせていただいた記事

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1