我注意到Rails路由调度程序中出现了意外行为,我想知道这是否违反了“最少惊喜原则”。
在resources :items, only: [:index, :new]
中定义RESTful路由时,我们可以按预期获得这些路由:
Prefix Verb URI Pattern Controller#Action
items GET /items(.:format) items#index
new_item GET /items/new(.:format) items#new
应该使用以下两行来手动定义每条路线:
get '/items' => 'items#index'
get '/items/new' => 'items#new'
现在,两者的第一行完全相同,事实上如果你试图定义resources :items, only: :index
和get '/items' => 'items#index'
一个命名路由被另一个“掩盖”:
Prefix Verb URI Pattern Controller#Action
items GET /items(.:format) items#index
GET /items(.:format) items#index
但第二行给出了另一个结果:items_new GET /items/new(.:format) items#new
。
尝试定义两种方式,并为同一URI获得两个命名路由:
Prefix Verb URI Pattern Controller#Action
new_item GET /items/new(.:format) items#new
items_new GET /items/new(.:format) items#new
那么为什么辅助方法会改变?此外,在定义每条路线时,您甚至无法获得edit
和show
行动的命名路线(请亲自尝试)。
关键字resources
不应只是一种快捷方式,以避免为index
,show
,new
,edit
,{{1}声明单独的路线}},create
和update
操作(正如in the doc所述)?