【開発ログ⑧】社員登録しようとしたら、ウチの会社じゃない支社も出てきた


前提について

はじめまして、
プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。

開発するのは「有給休暇管理ツール」です。仕様は過去記事をどうぞ。

アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。

今回実施する内容

支社登録が実装できたので、続けて社員の登録の実装を行います。社員は必ず1つの支社に所属しています。社員の登録画面のポイントは、ユーザーが登録した支社を選択できるようにすること。逆に他のユーザーが登録した支社は自社に関係なので表示させたくありません。手順は概ね前回の記事と同じなので割愛します。

基本的な実装は完了

作業は、前回とほぼ同じなので順調に進められました。今回は、社員ということで、モデル名はEmployeeとなります。

routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'branches#index'
  resources :branches, only: [:new, :create] 
  resources :employees, only: [:new, :create]
end
employees_controller.rb
class EmployeesController < ApplicationController
  def new
    @employee = Employee.new
  end
  def create
    Employee.create(employee_params)
    redirect_to root_path
  end
  private
  def employee_params
    params.require(:employee).permit(:name, :employment_status, :hire_date, :branch_id)
  end
end
new.hyml.haml
.employee__body
  新規社員登録
  .employee__body__form
    = form_for @employee do |f|
      .field
        .field-label
          = f.label "名前"
        .field-input
          = f.text_field :name, autofocus: true
      .field
        .field-label
          = f.label "雇用形態"
        .field-input
          = f.select :employment_status, [["フルタイム", "1"],["パートタイム", "2"]], include_blank: "選択して下さい"
      .field
        .field-label
          = f.label "入社日"
        .field-input
          = f.date_select :hire_date
      .field
        .field-label
          = f.label "所属支店"
        .field-input
          = f.collection_select :branch_id, Branch.all, :id, :name, include_blank: "選択して下さい"
      .actions
        = f.submit "登録", action: :create, class: 'btn'
_mainheader.html.haml
.main__header
  .nav
    .ragistation
      = link_to new_branch_path, class: "link" do
        支社登録
    .ragistation
      = link_to new_employee_path, class: "link" do
        社員登録
         〜以下省略〜

結果はちょっと違った

所属支店は、「collection_select」を使ってプルダウンで表示させています。参考にさせていただいたのは、こちらの記事です。すごくわかりやすい記事だったので、ついついそのまま使わせていただいたのですが、
所属支店名に別ユーザーが登録している支店まで表示されてしまいました。下の写真でいうと「薬院支店」と「平尾支店」は表示されてはいけないということになります。

collection_selectのモデル名が原因

原因は、collection_select内のモデル名の設定でした。「Branch.all」になっているので、当然全ての支社が呼び出されてしまうわけですね。whereメソッドを使用して、現在ログイン中のユーザーと同じ「user_id」をもつ支社のみが、表示されるようにコードを変更しました。

ビフォー。

new.hyml.haml
.employee__body
  新規社員登録
  .employee__body__form
    = form_for @employee do |f|
        〜中略〜
      .field
        .field-label
          = f.label "所属支店"
        .field-input
          = f.collection_select :branch_id, Branch.all, :id, :name, include_blank: "選択して下さい"
       〜以下省略〜

アフター。

new.hyml.haml
.employee__body
  新規社員登録
  .employee__body__form
    = form_for @employee do |f|
        〜中略〜
      .field
        .field-label
          = f.label "所属支店"
        .field-input
          = f.collection_select :branch_id, Branch.where(user_id: current_user.id), :id, :name, include_blank: "選択して下さい"
       〜以下省略〜

再びビューを確認

正しく表示されているかを確認し、なんとか意図通りの見た目になりました。これにて一件落着。

今日の積み上げ

記事を丸ごと移さずに、書かれているコードの意味や自分の作るアプリケーションに合っているかきちんと確認しよう。