0

我正在查看 Rails Guides 的“Rails Routing From The Outside In”部分,我遇到了这个部分:

有时,您有一个资源,客户端总是在不引用 ID 的情况下查找该资源。例如,您希望 /profile 始终显示当前登录用户的个人资料。在这种情况下,您可以使用单一资源将 /profile(而不是 /profile/:id)映射到 show 操作:

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

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

get 'profile', to: :show

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

4

2 回答 2

2

该文档有些误导,不是吗。这是一个糟糕的例子。关于传递符号以匹配的注释是一般注释,应该在关于单一资源的部分之外。

事实上,如果你单独尝试它,在启动或运行 Rails 时会出现以下错误rake routes

rake routes
rake aborted!
missing :controller

因此,您必须添加一个:controller选项才能在资源声明之外工作:

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

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

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

或者

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

然而,这两个示例都生成了与前一个示例不同的路由。再说一次,我认为评论放错了地方。

于 2013-11-09T21:34:56.160 回答
2

好像不知道...

#config/routes.rb

get 'profile', to: :show

从控制台:

$ rake routes
rake aborted
missing :controller

第一个例子:'users#show',确实创建了一个成功的路由,同样如此

get 'profile', to: :show, controller: 'users'
于 2013-11-09T21:24:59.573 回答