动作控制器错误。 Url 生成错误。没有路线匹配

Action Controller error. Url Generation error. No route matches

我正在 lynda.com 上完成 "Ruby on rails 3 essential training",但在生成我的服务器时遇到了问题。到目前为止,我已将 subjects_controller.rb、link 编辑到我的视图文件夹和文件 list.html.erb。尝试启动服务器时我的错误是:

No route matches {:action=>"show", :controller="subjects", :id=>1}

在我的 list.html.erb 文件中,我编写了代码:

<td class="actions">
  <%= link_to("Show", {:action => 'show', :id => subject.id}, :class => 'action show') %>
  <%= link_to("Edit", '#', :class => 'action edit') %>
  <%= link_to("Delete", '#', :class => 'action delete') %>
</td>

我的 subjects_controller.rb 看起来像:

class SubjectsController < ApplicationController
  def list 
    @subjects = Subject.order("subjects.position ASC")
  end
end

我已经仔细检查以确保我写的所有内容都与讲师相同,但似乎缺少 link。有任何想法吗?如果我完全停止操作:

<%= link_to("Show", {:action => 'show', :id => subject.id}, :class => 'action show') %>

然后服务器启动。这里一定有问题,但我不确定它是什么。此外,当教师在他的文本编辑器上输入 link_to 时,txt 会变成不同的颜色,而我的不会。他的“@”实例变量也是如此。我的没有变色。也不确定这是否意味着什么。感谢您的任何输入!

这是我的 config/routes.rb 文件:

Rails.application.routes.draw do
  root :to => "demo#index"
  get 'demo/index'
  get 'demo/hello'
  get 'demo/other_hello'
  get 'subjects/list'
end

简短版:错误消息告诉您到底出了什么问题。您没有匹配的路线,因为虽然您的操作名为 list,但您的 link 指定为 :action => 'show'

更长的版本:link_to 助手的第二个参数应该告诉 Rails 为 link 生成什么 URL,通常通过指定你的按名称路由,但有时(如本例)通过指定操作(以及可选的控制器)。您正在指定操作 showsubjects 控制器是隐含的。因此,Rails 正在尝试找到一条路线(在您的 routes.rb 中定义的路线中),以获取 SubjectsController#show 操作。然而,从你的 routes.rb 可以看出,你只在 SubjectsController 上定义了一条路线,那就是 list.

如果您对自己拥有的路线或它们的名称感到困惑,可以使用 rake routes 任务以易于阅读的格式将它们全部列出。

编辑以回复后续问题:

The instructor is telling me that when you generate a controller and action that its supposed to add a route to the routes.rb folder. This worked for me earlier but when creating these actions that I'm having trouble with now, it didn't generate anything in the routes.rb folder. Do you know why that is?

当您的讲师说 'generate' 时,他们的意思可能是 'use the rails generate command'。当您使用生成器创建控制器并在其中指定操作时,它还会将这些操作添加到路由文件中。 另一方面,如果您将操作写入现有控制器(包括使用控制器的生成器但不指定操作),或者您自己创建控制器文件,则必须手动更新路由文件。如果您正在使用生成器并指定操作但没有获得更新的路线,我不确定发生了什么。

就个人而言,无论如何我更喜欢手写我的路线 - 生成器通常不会完全正确。