没有路由匹配{:action =>“show”,:controller =>“schools”}缺少必需的键:

我不知道为什么我无法为我项目中的每所学校创建信息链接。 这是完整的错误:

没有路由匹配{:action =>“show”,:controller =>“schools”}缺少必需的键:[:id]

这是我的index.html.erb:

   

schools_controller.rb:

 class SchoolsController < ApplicationController def show @school = School.find(params[:id]) end def new @school = School.new end def edit @school = School.find(params[:id]) end def index @schools = School.all end def create @school = School.new(school_params) @school.save redirect_to @school end private def school_params params.require(:school).permit(:name) end end 

您需要将school对象或学校ID传递给school_path方法。 所以它可以通过该id创建路径。 你可以这样做;

 <% @schools.each do |school| %> <%= school.name %> <%= link_to "Info", school_path(school), class: "btn btn-info" %> 
<% end %>

因为你正在学习,我会给你一些背景知识。

没有路线匹配

该错误意味着您的Rails路由无法找到您所引用的路由。

它给出了以下规范:

缺少必需的密钥:[:id]

这意味着路由存在 ,但您没有填写id参数。

为帮助您了解其工作原理,请考虑以下事项 :

  GET /photos photos#index display a list of all photos GET /photos/new photos#new return an HTML form for creating a new photo POST /photos photos#create create a new photo >> GET /photos/:id photos#show display a specific photo GET /photos/:id/edit photos#edit return an HTML form for editing a photo PATCH/PUT /photos/:id photos#update update a specific photo DELETE /photos/:id photos#destroy delete a specific photo 

这些是在Rails中使用resources指令创建的路由 。 我现在不会解释它 – 只是说当你打电话给school_path ,你指的是路线中的GET /schools/:id路径。

因此,您必须记住的是,当您调用此路线时,您必须向其发送一个idurl.com/schools/1 。 这允许控制器查找适当的记录( School.find params[:id] )。

你打电话的时候…

 <%= link_to "Info", school_path, class: "btn btn-info" %> 

…你没有把任何参数传递给school_path

要修复它,你必须传递id ,如果传递适当的对象,Rails将自动执行:

 <%= link_to "Info", school_path(school), class: ".." %> 

要么

 <%= link_to "Info", school, class: "..." %>