1

我正在关注 Rails 上的 Lynda 教程,除了包含相应信息的 list.html.erb 文件之外,我还定义了列表操作。

但是,当我继续访问 ~/subjects/list 时,我得到了这个:

未知动作

找不到 SubjectsController 的操作“显示”

这是来自我的控制器的代码:

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>&nbsp;</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>
4

3 回答 3

2

您必须修改您的resources :subjects行以使其看起来像这样

resources :subjects do
  get 'list', on: :collection
end

这样,主题/列表 URL 将在您的应用程序中可用。

让我再解释一下:resources :subjects默认创建 7 个路由(url),它们与您的 7 个操作相关SubjectsController(例如,GEThttp resquest 类型 + /subjectsurl 将调用该index操作)。查看您的rake routes输出(来自您的问题帖子)以了解更多信息。如果您想拥有更多以 开头的 url subjects/,您可以在resources块内添加如下行:

get 'list', on: :collection

这只是意味着将创建一个subjects/list由 http 方法调用的 url 。GETon: collection意味着 url 不会像subjects/1/list.

有关更多信息,我建议阅读Rails Routing from the Outside In

于 2013-05-05T19:11:50.743 回答
0

刚刚过去了完全相同的问题。正如 SDP 指出的那样,Rails 3.x 和 Rails 4 之间存在一些差异。Rails 4 需要 Show 模板已经可用,即使您没有单击主题/列表 url 上的 Show 按钮。解决问题的最简单方法是在视图中的链接中临时放置一个占位符 ('#'),直到教程的下一章,您可以在其中编写 Show 模板和操作。

于 2014-01-20T18:06:17.720 回答
0

我没有找到确认这一点的更改日志,但我高度怀疑您遇到的问题是由于 Rails 3.x 和 Rails 4 之间的差异。

我最近浏览了同一个 Lynda.com 教程,他肯定在使用 Rails 3,并且在一些地方他所做的事情与 Rails 4 的工作方式不完全一致。例如,当他生成迁移时,有updown方法,而在 Rails 4 中我得到一个change方法。

所以我很确定你的问题是另一个例子,因为我和你一样,看到这不会resources :controllername导致控制器名称/列表的路由。我的预感是 /list 已合并到 /index 操作中(这是我回避问题的方式),但我没有足够的权威来说明这是否是最佳实践。

于 2013-08-16T14:54:31.413 回答