Если посмотреть, как определяются ваши маршруты, у вас есть что-то вроде этого:
employee_register_hours GET /employees/:employee_id/register_hours(.:format) register_hours#index
POST /employees/:employee_id/register_hours(.:format) register_hours#create
employee_register_hour GET /employees/:employee_id/register_hours/:id(.:format) register_hours#show
PATCH /employees/:employee_id/register_hours/:id(.:format) register_hours#update
PUT /employees/:employee_id/register_hours/:id(.:format) register_hours#update
DELETE /employees/:employee_id/register_hours/:id(.:format) register_hours#destroy
employees GET /employees(.:format) employees#index
POST /employees(.:format) employees#create
employee GET /employees/:id(.:format) employees#show
PATCH /employees/:id(.:format) employees#update
PUT /employees/:id(.:format) employees#update
DELETE /employees/:id(.:format) employees#destroy
Если вы видите там, URI, маршрутизирующий действие index в RegisterHoursController, только указывает, что employee_id
в параметрах ожидается. Но в вашем приватном set_hour
методе вы ожидаете, что параметры содержат id
, соответствующий существующей записи RecordHour в вашей базе данных:
RegisterHour.find(params[:id])
Там, где происходит ваша ошибка. Поскольку вы не отправляете этот идентификатор, команда find вызывает ошибку ActiveRecord::RecordNotFound
.
У вас есть простое решение - удалить этот метод и все, что с ним связано. Итак, ваш RegisterHoursController может оказаться гораздо более простым:
class RegisterHoursController < ApplicationController
def index
@employee = Employee.find(params[:employee_id])
json_response(@employee.register_hours)
end
private
def hour_params
params.permit(:status)
end
end
Почему? Поскольку вы не получаете идентификатор RegisterHour, то set_hour
не требуется, таким образом set_employee_hour
также становится ненужным, потому что @employee.register_hours.find_by(id: params[:id])
всегда будет возвращать nil
.
Удаление этого, в итоге вы получите set_employee, который можно просто переместить в действие, к которому он принадлежит, что позволит вам удалить обратный вызов before_action
.
Обратите внимание: если вы используете только действие index в RegisterHoursController, тогда вы можно избежать генерации всех других ненужных маршрутов:
resources :employees do
resources :register_hours, only: :index
end