我正在审核Rails指南的"Rails Routing From The Outside In"部分,我看到了这一部分:
有时,您拥有一个客户端始终无需查找的资源 引用ID。例如,您希望/ profile始终显示 当前登录用户的配置文件。在这种情况下,您可以使用 一个奇异的资源来映射/配置文件(而不是/ profile /:id) 显示行动:
get 'profile', to: 'users#show'
传递一个String来匹配将需要一个控制器#动作格式, 传递符号时会直接映射到一个动作:
get 'profile', to: :show
指南说“传递一个符号将直接映射到一个动作”,但是假设我有多个控制器,每个控制器都有一个“显示”动作。 Rails如何知道使用哪一个,因为我不再引用特定的控制器了?
答案 0 :(得分:2)
看来它不知道......
#config/routes.rb
get 'profile', to: :show
来自控制台:
$ rake routes
rake aborted
missing :controller
第一个例子:'users#show',确实创建了一条成功的路线,
也是如此get 'profile', to: :show, controller: 'users'
答案 1 :(得分:2)
该文档有些误导,不是吗。这是一个糟糕的例子。关于传递符号以匹配的注释是一般性注释,应该在单一资源部分之外。
事实上,如果您单独试用它,启动Rails或运行rake routes
时会出现以下错误:
rake routes
rake aborted!
missing :controller
所以你必须在资源声明之外添加一个:controller
选项:
get 'profile', to: :show, controller: 'users'
他们指定的语法在resources
或resource
声明中有效,例如:
resources :user do
collection do
get 'profile', to: :show
end
end
或
resource :user do
get 'profile', to: :show
end
然而,这些示例都生成与前一示例不同的路由。所以,我认为评论是错误的。