在Rails中错误地路由/索引到/显示

时间:2016-07-21 20:52:58

标签: ruby-on-rails

必须有一个明显的答案,但我不知所措。

我有一个跟踪网站的Rails应用。无论出于何种原因,localhost:3000 / sites都会导致我的索引页面。但是,localhost:3000 / sites / index会导致我的显示页面。

为什么会这样?

以下是路线档案:

Rails.application.routes.draw do

  resources :sites

以下是网站控制器:

class SitesController < ApplicationController

  def index
  end

  def show
  end

end

在views / sites中,有index.html.erb和show.html.erb文件。前者显示在/ sites,后者显示在/ sites / index(和/ sites / show一样)。

感谢您的帮助!

更新:

当我耙路线时,我得到:

Prefix Verb   URI Pattern               Controller#Action
sites GET    /sites(.:format)          sites#index
      POST   /sites(.:format)          sites#create
new_site GET    /sites/new(.:format)      sites#new
edit_site GET    /sites/:id/edit(.:format) sites#edit
 site GET    /sites/:id(.:format)      sites#show
      PATCH  /sites/:id(.:format)      sites#update
      PUT    /sites/:id(.:format)      sites#update
      DELETE /sites/:id(.:format)      sites#destroy

这些路线是人们所期望的,但我想我只是惊讶于网站/索引假定索引是:id并因此路由请求显示。

我想我之前从未明确地遇到过这种行为。

3 个答案:

答案 0 :(得分:3)

默认情况下,控制器中有7项基本操作,其中只有2项与网址中的名称匹配 - (newedit)。这两个是HTML结构,它们只是一种呈现表单的方式。

另外5个(索引,显示,更新,创建,销毁)是更基本的路由,并且可以显示和修改资源。它们仅由两个 url模式引用(上面提到的两种模式 - 例如'/ sites'和'/ sites /:id')。它们由与请求一起的方法区分:(补丁,发布,获取,删除)。因此,“/ sites”将用于createindex。 “/ sites /:id”将用于showdestroyupdate

控制器中的操作未完全由url引用 - url模式和请求方法一起用于调用关联的控制器方法。

在请求“/ sites / index”中,由于字符串“index”在url中,匹配的唯一路由是在“/ sites /”之后具有变量的路由。 :id只是一个变量,不一定是整数。由于请求是GET,因此第一个(也是唯一的)路由匹配是sites#show。 “index”将是传递给show动作的params[:id]的值。

答案 1 :(得分:1)

您的索引页位于:localhost:3000/sites

导航至localhost:3000/rails/info/routes,以便在开发模式下查看完整的应用路由。

答案 2 :(得分:1)

这是路由在Rails中的工作方式。请查看Rails routing以更好地了解其工作原理。特别是 Rails resource routing部分。

通常,当您设置资源路径时,网址将如下所示:

example.com/sites #=> index page
example.com/sites/:id #=> show page. A specific site, where :id would be the unique identifier

# Here's an example URL with a specific site
example.com/sites/stackoverflow