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

Rails: Difference between declaring a route directly inside the `resources` block vs. enclosing it with a `member` block

下面的/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

首先,如果我们写member块或者直接在resources里面写get路由,都被认为是成员路由。

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

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

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

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

resources :animals do
    get 'info'
end

animal_info GET    /animals/:animal_id/info(.:format)    animals#info

如果我们直接在资源中使用 on: 选项和值 :member 编写 get 路由,那么这将被视为与成员块路由相同

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

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