首页 > 解决方案 > 员工控制器中的 ActiveRecord::RecordNotFound#edit

问题描述

尝试编辑员工时出现错误。完整的错误信息是:

员工控制器中的 ActiveRecord::RecordNotFound#edit

找不到“id”=5 的公司(*这取决于我点击的公司)

提取的源代码(在 #57 行附近):

def find_company
    @company = Company.find(permitted_params[:company_id])
  end
end

有了这个应用程序,我就有了公司和员工。我可以在公司内添加、显示和删除员工,但由于此错误,我无法对其进行编辑。我是 Rails 新手,不确定我哪里出错了。

路线.rb:

Rails.application.routes.draw do
  get 'welcome/index'

  resources :companies do
    resources :employees
  end

  root 'welcome#index'

  get 'companies/new'
end

员工控制器:

class EmployeesController < ApplicationController
  before_action :find_company
  before_action :set_employee, only: %i[show edit update destroy]

  def index
    @employees = @company.employees
  end

  def show
    @employee = Employee.find(params[:id])
  end

  def new
    @employee = @company.employees.build
  end

  def edit
    @employee = Employee.find(params[:id])
  end

  def create
    @employee = @company.employees.build(permitted_params[:employee])
    if @employee.save
      redirect_to company_employees_path(@company)
    else
      render 'new'
    end
  end

  def update
    if @employee.update(forename: permitted_params[:forename],
                        surname: permitted_params[:surname])
      redirect_to company_employees_path(@company)
    else
      render 'edit'
    end
  end

  def destroy
    @employee.destroy
    redirect_to company_employees_path(@company)
  end

  private

  def set_employee
    @employee = Employee.find(permitted_params[:id])
  end

  def permitted_params
    params.permit!
  end

  def find_company
    @company = Company.find(permitted_params[:company_id])
  end
end

公司控制人:

class CompaniesController < ApplicationController

  def index
    @company = Company.all
  end

  def show
    @company = Company.find(permitted_params[:id])
    # @company = Company.first
  end

  def new
    @company = Company.new
  end

  def create
    @company = Company.new(permitted_params[:company])

    if @company.save
      redirect_to @company
    else
      render 'new'
    end
  end

  def destroy
    @company = Company.find(permitted_params[:id])
    @company.destroy

    redirect_to companies_path
  end

  private

  def permitted_params
    params.permit!
  end
end

耙路线输出:

Prefix Verb   URI Pattern                                                                              Controller#Action
                        welcome_index GET    /welcome/index(.:format)                                                                 welcome#index
                    company_employees GET    /companies/:company_id/employees(.:format)                                               employees#index
                                      POST   /companies/:company_id/employees(.:format)                                               employees#create
                 new_company_employee GET    /companies/:company_id/employees/new(.:format)                                           employees#new
                edit_company_employee GET    /companies/:company_id/employees/:id/edit(.:format)                                      employees#edit
                     company_employee GET    /companies/:company_id/employees/:id(.:format)                                           employees#show
                                      PATCH  /companies/:company_id/employees/:id(.:format)                                           employees#update
                                      PUT    /companies/:company_id/employees/:id(.:format)                                           employees#update
                                      DELETE /companies/:company_id/employees/:id(.:format)                                           employees#destroy
                            companies GET    /companies(.:format)                                                                     companies#index
                                      POST   /companies(.:format)                                                                     companies#create
                          new_company GET    /companies/new(.:format)                                                                 companies#new
                         edit_company GET    /companies/:id/edit(.:format)                                                            companies#edit
                              company GET    /companies/:id(.:format)                                                                 companies#show
                                      PATCH  /companies/:id(.:format)                                                                 companies#update
                                      PUT    /companies/:id(.:format)                                                                 companies#update
                                      DELETE /companies/:id(.:format)                                                                 companies#destroy
                                 root GET    /                                                                                        welcome#index
                        companies_new GET    /companies/new(.:format)                                                                 companies#new

公司 show.html.erb

<h3><%= @company.name %></h3>
<p><%= @company.details %></p>

<h3>Employees</h3>
<table class="table table-striped">
  <thead>
    <tr>
      <th>ID</th>
      <th>Forename</th>
      <th>Surname</th>
      <th>Actions</th>
    </tr>
  </thead>

  <tbody>
    <% for employee in @company.employees %>
      <tr>
        <td><%= employee.id %></td>
        <td><%= employee.forename %></td>
        <td><%= employee.surname %></td>
        <td><%= link_to "Edit", edit_company_employee_path(employee), class: "btn btn-primary btn-sm" %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<%= link_to "Add Employee", new_company_employee_path(@company), class: "btn btn-primary" %>

<%= link_to "Back to companies List", companies_path, class: "btn btn-outline-primary" %>

请问有人可以帮忙吗?

标签: ruby-on-railsrubyactiverecord

解决方案


尝试传递@companyedit_company_employee_path.

<%= link_to "Edit", edit_company_employee_path(@company, employee), class: "btn btn-primary btn-sm" %>

推荐阅读