ruby-on-rails - 找不到没有 ID 的 <Model> - rails 5

标签 ruby-on-rails error-handling ruby-on-rails-5

我有两个模型: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/

相关文章:

ruby-on-rails - Ruby on Rails-错误500

ruby-on-rails - ActiveRecord 查询最后一天的所有数据以及之前的每 100 条记录

ruby-on-rails-5 - 我可以在没有 Ruby 的情况下生成 Rails SECRET_KEY_BASE 吗?

ruby - Distinct 不适用于 select 子句

ruby-on-rails - 在 rails fixture 中使用自定义外键标记引用

ruby-on-rails - 撤消 rails 会产生设计 View

php - 在php中显示除notice和strict之外的所有错误

C++11 从函数返回错误代码

ruby-on-rails - 从 Heroku 下载 PG 数据库文件

ruby-on-rails - Rails 中的 respond_to 和 respond_with 有什么区别?