【開発ログ⑨】社員登録ができなくなった?


前提について

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

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

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

今回の実施内容

前回までで、支社と社員の登録が完成しました。記事では取り上げませんが、ビューページの左カラムに登録した支社名と支社に所属する従業員数が、メインビューの有休管理一覧の「名前」と「入社日」に登録した社員のものが各表示されるようにeach文を記述しました。結果は以下のとおりです。

ということで、今回は、ログイン時のindex画面を変更します。具体的には、ログイン時には左のカラムのみが表示されていて、支店名をクリックするとメイン画面に有休管理一覧が出てくるようにしたいわけです。

  • ルーティングの編集
  • 「employees_controller.rb」にindexアクションを追加
  • 「index.html.haml」の編集
  • この変更により、他の機能が正常に動くかチェックできればOK

ここまで実装できました

基本順調でしたが、このあとエラーがでます。もし同じように初学者の方で、読んでいる方がいれば、まるごとコピーすると危険です。

routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'branches#index'
  resources :branches, only: [:new, :create] do
    resources :employees, only: [:index, :create]
  end
  resources :employees, only: :new
end
employees_controller.rb
class EmployeesController < ApplicationController
  def index
    @employees = Employee.where(branch_id: params[:branch_id])
  end
                  〜中略〜
end
branches/index.html.haml
.wrapper
  = render 'side'
employees/index.html.haml
.wrapper
  =render 'branches/side'
  =render 'branches/main'

ここまでの記述で問題なく支店名をクリックすると対応する「有給休暇管理一覧」が表示されるようになりました。念のため、他の機能も確認したらエラーが!!

社員登録が表示されない

ビューページの「社員登録」をクリックするとエラーが!!

前回は、form_forは正常に機能したのに、今回はうまくいきません。記述が間違っているのではないか、ということで調査しました。form_forにパスを明示しないといけないという記事も見つけて実行してみました。

employees/new.html.haml
.employee__body
  新規社員登録
  .employee__body__form
    = form_for @employee, url: root_path do |f|

上のコード入力で新規社員登録画面は、表示されましたが、「送信」をクリックすると今度は「Routing Error」になりました。何が原因なんや!!

結局、form_forの記述ミスではないようなので、一旦元の状態に戻しました。

原因はルーティングでした

もう一度記述したコードを順に眺めていて異変に気が付きました。employeesのルーティングの設定のうち、createアクションが、支社のbranchesにネストされていたのです。こちらを修正しました。

ビフォー。

routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'branches#index'
  resources :branches, only: [:new, :create] do
    resources :employees, only: [:index, :create]
  end
  resources :employees, only: :new
end

アフター。

routes.rb
Rails.application.routes.draw do
  devise_for :users
  root 'branches#index'
  resources :branches, only: [:new, :create] do
    resources :employees, only: :index
  end
  resources :employees, only: [:new, :create]
end

社員登録できました

改めて社員登録を行うと問題なく、indexに返ってくることができました。木久扇師匠も問題なく入社できました。おめでとうございます!!

今日の積み上げ

新しい機能を実装したときは、以前に実装した機能も正常に動くか確認することが大切であると思いました。