完成" Ruby on rails 3基本培训"我遇到了路线和网址的问题。我创建了一个带有'列表的sujects_controller。行动和展示'行动。在我的localhost中,当我进入时: localhost:3000.subjects / list,我收到错误,无法找到id = list' 但是,当我进入时: 本地主机:3000.subjects。我得到了输入第一个URL时应该出现的列表。此外,输入第二个URL后,我有显示,编辑和删除的链接。当我将鼠标悬停在链接"显示",在页面底部时,将来的输出将读取localhost.3000 / subject(3)。此链接有效。但是,根据我的教师教程,应该阅读localhost.3000 / subjects / show / 3。出于某种原因,我的链接和/或操作没有正常工作,我不确定为什么,因为我按照说明进行操作。
这是我的subjects_controller.rb文件:
class SubjectsController < ApplicationController
def index
list
render('list')
end
# def index
# show
# render('show')
# end
def list
@subjects = Subject.order("subjects.position ASC")
#@subjects = Subject.all
end
def show
@subjects = Subject.find(params[:id])
end
def new
@subjects = Subject.new
end
def create
@subject = Subject.new(params[:subject])
if @subject.save
redirect_to(:action => 'list')
else
render('new')
end
end
end
这是我的list.html和show.html文件:
<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>
Show.html
<%= link_to("<< Back to list", {:action => 'list'}, :class => 'back-link') %>
<div class="subject show">
<h2>Show Subject</h2>
<table summary="Subject detail view">
<tr>
<th>Name</th>
<td><%= @subject.name %></td>
</tr>
<tr>
<th>Position</th>
<td><%= @subject.position %></td>
</tr>
<tr>
<th>Visible?</th>
<td><%= @subject.visible ? 'true' : 'false' %></td>
</tr>
<tr>
<th>Created</th>
<td><%= @subject.created_at %></td>
</tr>
<tr>
<th>Updated</th>
<td><%= @subject.updated_at %></td>
</tr>
</table>
</div>
我的config / routes.rb文件:
Rails.application.routes.draw do
root :to=>"demo#index"
get 'demo/index'
get 'demo/hello'
get 'demo/other_hello'
resources :subjects
get 'subjects/list' => 'subjects#list'
get 'subjects/list' => 'subjects#show'
get 'subjects/create' => 'subjects#create'
教师永远不会显示他的routes.rb文件,所以我刚开始使用gets来让我的行动起作用。资源:科目无法处理所有事情,所以我使用了GET。同样在我的subject_controller中我def:索引到渲染列表。如果我不这样做,那就没有任何作用。我显然对这一切都很陌生但是喜欢学习它并且感谢所有信息。我已经看过导游的导轨路线,但这对我没什么帮助。它更多的概念/理论为什么我的链接/行动不起作用,我很有兴趣听到。感谢您的任何信息!
答案 0 :(得分:2)
在路线中指定
resources :subjects
它创建了七个动作(索引,新建,创建,创建,显示,编辑,更新,销毁)
当你致电localhost:3000/subjects
时,它会询问路线去哪里。并且index
操作被称为
/subjects
subjects#index
显示所有主题的列表
当你说localhost:3000/subjects/list
时
它在id
之后期望/subjects
,因为有路由映射到
localhost:3000/subjects/5
当你打电话给它时,它会在控制器中调用show方法,要求在数据库中输入id为5的记录
/subjects/:id
subjects#show
如果要查看所有路径,请从控制台类型中查看
rake routes
如果你想定义额外的方法,如下面的list
get 'subjects/list' => 'subjects#list'
并从路径文件
中删除list
的所有其他路由
还有更多选项可指定routes
并了解这是您最好的朋友
答案 1 :(得分:1)
问题是您的routes.rb
文件。当您指定resources :subjects
时,您要添加许多路线,其中一条路线为get 'subjects/:id' => 'subjects#show'
由于路线优先取决于您编写的顺序(从上到下),因此会覆盖您的get 'subjects/list' => 'subjects#list'
行。
您还有许多其他冗余路由被覆盖。
get 'subjects/list' => 'subjects#list'
get 'subjects/list' => 'subjects#show'
主题#show将永远不会被调用,因为调用主题#list的路由将优先
答案 2 :(得分:1)
这是因为你第一次退出
resources :subjects
然后是其他路线。
在您的情况下,将路由添加到资源的最佳方法如下:
resources :subjects do
collection do
get :list, to: :show
end
end
这将产生:
# rake routes
list_subjects GET /subjects/list(.:format) subjects#show
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
PATCH /subjects/:id(.:format) subjects#update
PUT /subjects/:id(.:format) subjects#update
DELETE /subjects/:id(.:format) subjects#destroy