Rails何时在控制器中寻找Index方法,何时寻找show方法

dot*_*ner 4 ruby-on-rails rails-routing

我是Rails的新手,并且一直在学习教程。

我一直在摆弄route.rb,现在对它什么时候寻找show方法以及什么时候寻找索引方法(如果没有明确提及)完全感到困惑。

小智 6

index 和 show 都是 GET 方法,但不同的是,index 是集合类型,show 是成员类型。这意味着index不需要url中的任何参数,但show需要url中的id参数。

EX:
Index: /posts
Show: /posts/:id
Run Code Online (Sandbox Code Playgroud)


Kru*_*pös 5

Rails 选择了convention over configuration. 这就是为什么这些操作没有明确命名。

以下是给定控制器的预期操作的完整列表:http://edgeguides.rubyonrails.org/routing.html#crud-verbs-and-actions

原始动词和动作


max*_*max 5

路线就像类固醇上的正则表达式一样。它们具有定义顺序的优先级,并且与请求方法,URI和您添加的任何其他约束匹配。

 get '/posts', to: 'posts#index'
 get '/posts/:id', to: 'posts#show'
Run Code Online (Sandbox Code Playgroud)

与上述路由的主要区别在于,请求uri的路径必须匹配的正则表达式不同。'/posts/:id'包含匹配的命名段:

GET /posts/11
GET /posts/gobligook
Run Code Online (Sandbox Code Playgroud)

但不是:

GET /posts
GET /posts/1/foo
GET /posts/foo/bar
Run Code Online (Sandbox Code Playgroud)

完整的CRUD动词的常规集合是:

get    '/posts',          to: 'posts#index'   # all posts
get    '/posts/new',      to: 'posts#new'     # form to create a post
post   '/posts',          to: 'posts#create'  # create a post from a form submission
get    '/posts/:id',      to: 'posts#show'    # show a single post
get    '/posts/:id/edit', to: 'posts#edit'    # form to edit a post
put    '/posts/:id',      to: 'posts#update'  # for legacy compatibility 
patch  '/posts/:id',      to: 'posts#update'  # update a post from a form submission
delete '/posts/:id',      to: 'posts#destroy' # delete a post
Run Code Online (Sandbox Code Playgroud)

在Rails风格的REST中,操作是从路径和方法隐式派生的。实际上,仅用于渲染表单
newedit方法在路径中显式添加了操作-这是因为它们作用于集合或集合的成员。

请注意,'/posts/new'必须先声明路由,get '/posts/:id'否则显示路由将首先与请求匹配(路由按照定义的顺序具有优先级)。这不适用get '/posts/:id/edit'于此模式,因为模式不同。

当然,输入所有这些路线确实很繁琐,因此rails提供了可以为您完成此操作的resources

resources :posts
Run Code Online (Sandbox Code Playgroud)