Rails:直接在`resources`块内部声明路由与用`member`块包围路由之间的区别

问题描述 投票:1回答:1

以下/animals/:animal_id/info(.:format)/animals/:id/info(.:format)路由之间的区别是什么,除了参数名称?为什么参数名称不同?

config/routes.rb

Rails.application.routes.draw do
  resources :animals do
    get 'info'

    member do
      get 'info'
    end
  end
end

~/myrails>rails routes

       Prefix Verb   URI Pattern                        Controller#Action
  animal_info GET    /animals/:animal_id/info(.:format) animals#info
  info_animal GET    /animals/:id/info(.:format)        animals#info
ruby-on-rails ruby model-view-controller router
1个回答
3
投票

首先,如果我们编写member块或直接在resources内编写get路由,那么这两个路由均被视为成员路由。

这是区分两条路线的rails约定。如果我们编写成员块,则认为该块中声明的所有路由都是从成员块中显式声明的。

resources :animals do
    member do
      get 'info'
    end
end

info_animal GET    /animals/:id/info(.:format)    animals#info

但是,如果我们直接在get块内声明resources或其他路由,这将also创建相同的member路由,除了resource id值将在params[:animal_id]中而不是[ C0]。路由助手也会从params[:id]info_animal_url重命名为info_animal_pathanimal_info_url。我认为这是与请求不是来自animal_info_path块的区别。

member

如果直接在资源中用resources :animals do get 'info' end animal_info GET /animals/:animal_id/info(.:format) animals#info 选项用get值写on:路由,则将其与成员块路由相同

:member
© www.soinside.com 2019 - 2024. All rights reserved.