【问题标题】:How to name a route on a resource?如何命名资源上的路由?
【发布时间】:2014-09-08 12:22:40
【问题描述】:

如果我有一个控制器 Home 和一个单一的动作 index,我知道我可以写:

get 'home' => 'home#index"

我将自动拥有命名路由home_path

但如果我这样定义:

resources :home, only: :index

我得到了home_index_path 的路线。为什么会这样?如果我使用 resources 约定,我如何创建命名路由 home_path

【问题讨论】:

  • 当你定义路由为resources :home, only: :index时,你确实命名了路由,你可以调用home_path
  • 目前,如果我在应用程序布局中使用home_path,我会得到undefined local variable or method `home_path',但home_index_path 有效。

标签: ruby-on-rails path routing helper


【解决方案1】:

Rails 为路由文件中的所有资源定义了标准命名约定。请参阅Rails Guide on Resource Routing

您还可以运行 bundle exec rake routes 来查看您在应用程序中定义的路由的名称。

在您的示例 resources :home, only: :index 中,"homes#index" 操作的命名路由将是 homes_pathhomes_url

更新

您可能更喜欢resource :home, only: :show,它的命名路由为home_pathhome_url。此外,访问 home 资源(单数)的路径是 /home,而 home 资源(复数)索引是 /homes

【讨论】:

  • 但是如果我的控制器是单数的——HomeController 怎么办?目前,如果我在我的应用程序布局中使用home_path,我会得到undefined local variable or method `home_path',并且必须使用home_index_path
  • rails 约定是控制器名称始终是复数,无论您如何访问它们。所以HomesController.
  • 这是强制性的吗?我在 RailsGuides 中找到了这个:The naming convention of controllers in Rails favors pluralization of the last word in the controller's name, although it is not strictly required (e.g. ApplicationController).
  • 这不是强制性的,但如果您遵循约定,它允许您使用默认路由。
  • 好吧,但还有一件更有趣的事情:如果我写get '/home' => 'home#index',我会自动得到home_path。这是为什么呢?
【解决方案2】:

可以在 Rails 路由中使用单数名称控制器。尝试使用:

resource :home, :controller => 'home'

【讨论】:

  • 这也会创建home_index_path 而不是home_path
  • 请交叉检查您的路线应该是resource 而不是resources 像这样resource :home, :controller => 'home'
  • 是的,你是对的。我没有检查过。看看这里api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/…你可能会得到你想要的解决方案。
  • 不知道为什么,但它不适用于 index 方法。我在创建时尝试过它,它按预期工作resource :home, path: "home", only: :create。我使用了路径而不是控制器。
  • 我认为resource 只是一个对象,是集合的一部分。单个对象无法被索引,因此索引操作被关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 2013-11-16
  • 2012-05-04
  • 1970-01-01
  • 2019-06-30
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多