我有两个模型:RegisterHour 和 Employee
这是我的模型注册时间 :
class RegisterHour < ApplicationRecord
belongs_to :employee, class_name: 'Employee', foreign_key: 'employee_id'
end
这是我的模型:员工
class Employee < ApplicationRecord
has_many :register_hours, dependent: :destroy
end
我在这种情况下的路线映射
resources :employees do
resources :register_hours
end
这是我的 Controller :
class RegisterHoursController < ApplicationController
before_action :set_employee
before_action :set_hour, :set_employee_hour
def index
json_response(@employee.register_hours)
end
private
def set_hour
@register_hour = RegisterHour.find(params[:id])
end
def set_employee
@employee = Employee.find(params[:employee_id])
end
def set_employee_hour
@register_hour = @employee.register_hours.find_by(id: params[:id]) if @employee
end
def hour_params
params.permit(:status)
end
end
因此,当我运行路线时:http://my_url_in_local/employees/1/register_hours我收到了这个错误:
{
"message": "Couldn't find RegisterHour without an ID"
}
我很困惑,因为我有另一个具有相同结构的 Controller 来管理管理员和员工,它可以工作,但这个 Controller 不能。
我是rails新手,这让我很困惑,如果有人能帮助我理解我做错了什么,我会非常高兴:)
谢谢!!
最佳答案
看看你的路线是如何定义的,你有这样的事情:
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
如果您在此处看到,则在 RegisterHoursController 中路由索引操作的 URI 仅声明
employee_id
在参数中是预期的。但是在你的私有(private)set_hour
方法,您期望参数包含 id
对应于数据库中现有的 RecordHour 记录:RegisterHour.find(params[:id])
这就是你的错误发生的地方。由于您没有发送该 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 id,因此
set_hour
没必要,这样set_employee_hour
也变得不必要了,因为 @employee.register_hours.find_by(id: params[:id])
总是要返回 nil
.删除它,你最终会得到 set_employee,它可以移动到它所属的操作,允许你删除
before_action
打回来。请注意,如果您仅在 RegisterHoursController 中使用 index 操作,则可以避免生成所有其他不需要的路由:
resources :employees do
resources :register_hours, only: :index
end
关于ruby-on-rails - 找不到没有 ID 的 <Model> - rails 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60033635/