Rails如何知道Rails指南在这个例子中使用哪个控制器的“show”动作?

时间:2013-11-09 20:50:43

标签: ruby-on-rails ruby ruby-on-rails-3 routes actioncontroller

我正在审核Rails指南的"Rails Routing From The Outside In"部分,我看到了这一部分:

  

有时,您拥有一个客户端始终无需查找的资源   引用ID。例如,您希望/ profile始终显示   当前登录用户的配置文件。在这种情况下,您可以使用   一个奇异的资源来映射/配置文件(而不是/ profile /:id)   显示行动:

get 'profile', to: 'users#show'
     

传递一个String来匹配将需要一个控制器#动作格式,   传递符号时会直接映射到一个动作:

get 'profile', to: :show

指南说“传递一个符号将直接映射到一个动作”,但是假设我有多个控制器,每个控制器都有一个“显示”动作。 Rails如何知道使用哪一个,因为我不再引用特定的控制器了?

2 个答案:

答案 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'

他们指定的语法在resourcesresource声明中有效,例如:

resources :user do
  collection do
    get 'profile', to: :show
  end
end

resource :user do
  get 'profile', to: :show
end

然而,这些示例都生成与前一示例不同的路由。所以,我认为评论是错误的。