我遵循关于rails的Lynda教程,并且除了包含相应信息的list.html.erb文件之外,还定义了list操作。
然而,当我继续访问~/subjects/列表时,我得到了这个:
未知的行动
无法找到SubjectsController的"show"操作
这是我的控制器的代码:
class SubjectsController < ApplicationController
def list
@subjects = Subject.order("subjects.position ASC")
end
end
谢谢!
更新:这是我从Rake路由
得到的 rake routes
subjects GET /subjects(.:format) subjects#index
POST /subjects(.:format) subjects#create
new_subject GET /subjects/new(.:format) subjects#new
edit_subject GET /subjects/:id/edit(.:format) subjects#edit
subject GET /subjects/:id(.:format) subjects#show
PUT /subjects/:id(.:format) subjects#update
DELETE /subjects/:id(.:format) subjects#destroy
更新:视图的代码list.html.erb:
<div class="subject list">
<h2>Subjects</h2>
<table class="listing" summary="Subject list">
<tr class="header">
<th> </th>
<th>Subject</th>
<th>Visible</th>
<th>Pages</th>
<th>Actions</th>
</tr>
<% @subjects.each do |subject| %>
<tr>
<td><%= subject.position %></td>
<td><%= subject.name %></td>
<td class="center"><%= subject.visible ? 'Yes' : 'No' %></td>
<td class="center"><%= subject.pages.size %></td>
<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>
</tr>
<% end %>
</table>
</div>
你必须修改你的resources :subjects
行,使它看起来像这样
resources :subjects do
get 'list', on: :collection
end
这样,一个subjects/list url将在你的应用程序中可用。
让我解释一下:resources :subjects
默认创建7个路由(url),这与您的SubjectsController
中的7个操作相关(例如,GET
http请求类型+ /subjects
url将调用index
操作)。看看你的rake routes
输出(来自你的问题贴)来了解更多。如果您希望有更多以subjects/
开头的url,您可以在resources
块中添加如下行:
get 'list', on: :collectio
n
这只是意味着GET
http方法调用的subjects/list
url将被创建。on: collection
表示url不会像subjects/1/list
那样。
更多信息,我建议阅读Rails Routing from the Outside In
我还没有找到一个更新日志来证实这一点,但我高度怀疑您遇到的问题是由于Rails 3之间的差异。4.
我最近看了同样的Lynda.com教程,他肯定在使用Rails 3,而且有一些地方他做的事情与Rails 4的工作方式并不完全一致。例如,当他生成迁移时,有up
和down
方法,而在Rails 4中,我得到一个change
方法。
所以我很确定你的问题是这个的另一个例子,因为我,像你一样,看到resources :controllername
不导致controllername/list的路由。我的直觉是/list已经合并到/index操作中(这就是我回避问题的方式),但我没有足够的权威来说明这是否是最佳实践。
最近遇到了完全相同的问题。正如SDP所指出的,Rails 3之间存在一些差异。x和Rails 4。Rails 4需要Show模板已经可用,即使您还没有单击主题/列表url上的Show按钮。解决这个问题的最简单方法是在视图的链接中临时放置一个占位符('#'),直到本教程的下一章,届时您将编写Show模板和操作。