【问题标题】:No route matches {:action=>"show", :controller=>"schools"} missing required keys: [:id]没有路线匹配 {:action=>"show", :controller=>"schools"} 缺少必需的键:[:id]
【发布时间】:2015-11-15 10:53:54
【问题描述】:

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

没有路线匹配 {:action=>"show", :controller=>"schools"} 缺失 所需键:[:id]

这是我的 index.html.erb:

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

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  

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    因为你正在学习,所以我会给你一些背景信息。

    --

    没有路线匹配

    该错误意味着您的Rails routes 找不到您拥有的引用路线。

    它给出了以下规范:

    缺少必需的键:[:id]

    这表示路由存在,但是你没有填写id参数。

    --

    为帮助您了解其工作原理,请考虑following

       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 路径。

    因此,您必须记住的是,当您调用此路由时,您必须向它发送id -- url.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: "..." %>
    

    【讨论】:

    • 感谢 Mr.Peck 的有用回答。祝你有美好的一天。
    【解决方案2】:

    您需要将学校对象或学校 ID 传递给 school_path 方法。因此它可以通过该 id 创建路径。您可以按照以下方式进行操作;

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

    【讨论】:

    • 非常感谢。我正在关注guides.rubyonrails.org 的教程,并试图为我的项目找出一些东西。祝你今天愉快。
    • 好的,我会的,它说我需要等待4分钟。再次感谢先生。
    • 你也可以使用&lt;%= link_to "Info", school, class: "..." %&gt;
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多