在Rails中,控制器和助手的名称应该使用单数还是复数?

117

使用单数名称作为控制器和帮助程序的名称是否有任何缺点?似乎没有什么依赖于这一点。甚至看起来帮助程序不需要像对应的控制器一样在单数和复数之间做出选择,至少根据我的有限实验是这样的。这是真的吗?


3
我也曾经面临同样的困境,无法确定是使用单数还是复数控制器名称! - Andrew
17
谢谢 :) Rails文化有一种让你觉得很傻,如果你质疑这样的事情。 - allyourcode
9个回答

163

明确是复数形式

使用restful路由和单数控制器

控制器:

dog_controller.rb  

路由(Routes):

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  

使用复数形式的控制器

控制器:

dogs_controller.rb

路由:

map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  

rails generate controller --help 提供了复数示例:

Example:
`rails generate controller CreditCards open debit credit close`

CreditCards controller with URLs like /credit_cards/debit.
    Controller: app/controllers/credit_cards_controller.rb
    Test:       test/controllers/credit_cards_controller_test.rb
    Views:      app/views/credit_cards/debit.html.erb [...]
    Helper:     app/helpers/credit_cards_helper.rb

23
同意。Rails 3.1 生成器关于控制器的帮助信息使用“CreditCard”(单数形式)作为示例,这令人感到困惑。 - bantic
4
Rails 的帮助文档现在使用复数形式:rails generate controller CreditCards open debit credit close。 - notapatch
3
这里仍然有一个单数的CreditCard:http://guides.rubyonrails.org/command_line.html#rails-generate - rcrogers
我们如何为单数控制器编写本地化文件?http://stackoverflow.com/questions/29650094/add-locales-to-singular-controller-in-rails4 - santosh
因此,命名应该是复数和驼峰式的。例如:rails generate controller Dogs new index create delete destroy edit。 - BenKoshy

29

使用复数形式的控制器名称只是一种惯例。

通常,复数名称听起来更自然(特别是对于直接与特定模型相关联的控制器:User->Users等),但您可以使用任何您想要的名称。

至于辅助函数,所有辅助函数默认情况下都可用于所有控制器,因此从技术上讲,命名辅助函数并不重要。这只是另一种惯例,即将控制器的帮助函数保存在与控制器同名的帮助程序中。


10
对应“用户”的控制器难道不应该叫做“UserController”吗?此外,如果你依赖默认路由,你会得到看起来像是在编辑所有用户的URL,比如/users/edit。对我而言,这样并不是很自然。 - allyourcode
5
@allyourcode:嗯,我想这都是主观的。对我来说,让/users列出所有用户比/user更自然。 - Can Berk Güder
1
哦,而且这是RESTful的方式。 - Can Berk Güder
4
“RESTful way”听起来像一个狂热的口号。但这并不令我惊讶,因为Rails整体上很有宗教色彩。我喜欢Rails如何着迷于REST,然而默认路由并不符合RESTful标准。即使是配置RESTful路由也不自然。在第二个参数中包括:conditions => {:method => :post}没有任何意义,因为哈希应该指定如何处理与当前规则匹配的任何请求,而不是确定任何给定请求是否匹配当前规则。 - allyourcode
3
根据这个链接,edit的默认路由是/users/:id/edit而不是/users/edit。说“在所有用户中,编辑具有id :id的用户”听起来很自然。 - DavidGamba
很酷,但如果您不想要路由/users/:id/edit(而是/user),或者不需要用户索引,只需创建一个单数控制器。这样做实际上也能节省授权开销。Rails 在 RESTful 方面有许多缺陷,因此遵循惯例只会帮助其他开发人员。 - vasilakisfil

21

模型是单数,因为它引用单个对象,例如用户。控制器是复数,因为它是对用户集合的控制(方法)。如何命名路由完全取决于开发人员。我从未听说过用户抱怨Web请求的URL是单数还是复数。最终结果是为了维护当前和未来贡献者的共同约定,同时为最终用户提供高质量的页面显示或API请求。


13

4
实际上,这是正确的答案,因为如果你仔细阅读它,它会说明对于资源的集合,复数是正确的答案。对于单一的资源,单数是正确的答案。文档中有例子。而且实际上,在这个其他帖子中已经很好地回答了这个问题:https://dev59.com/kXE85IYBdhLWcg3wx2n2 - Rob
回答像这篇帖子一样支持官方参考资料会对新手有很大的帮助!谢谢。 - Wasif Hossain

10
根据Rails约定,一个控制器只处理一个模型,无论在运行时是否存在一种或多种该模型的实例。但是,在某些情况下,您可以拥有一个Rails应用程序,在该应用程序中(某些)控制器(及其相关视图)与任何特定的模型都没有关联,而是处理一组更复杂的功能。在这种情况下,自动复数形式是没有意义的。
我当前正在处理的Rails应用程序符合此类别,并且令人烦恼的是,Rails希望我在一个地方将标识符定义为单数形式,然后在其他地方使用它们的复数形式。例如,我可能想在config/routes.rb中定义以下内容:
  resource :dashboard, :only => [:show]

然后我想要一个控制器DashboardController来显示有关应用程序某些方面的摘要信息,从多个数据库表中收集信息。因此,在这里,Dashboard不指代应用程序的任何模型,而且将控制器命名为DashboardsController会很奇怪。
我在这个答案中找到了自动复数形式的烦恼的好解决方案。简而言之,编辑文件config/initializers/inflections.rb并将您不希望自动复数化的单词添加到此定义中:
ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end

5
如果控制器是资源,那么它必须是复数形式...
例如:
控制器
articles_controller.rb

模型

article.rb

但是如果您没有相应的模型,可以使用单数控制器名称,例如:

welcome_controller.rb

4
Rails中控制器的命名惯例偏向于使用控制器名称中最后一个单词的复数形式,尽管不是强制性要求(例如:ApplicationController)。
例如,ClientsController优于ClientController,SiteAdminsController优于SiteAdminController或SitesAdminsController等。
遵循这个惯例将允许您使用默认路由生成器(例如:资源等)而无需限定每个:path或:controller,同时还将保持应用程序中URL和path helpers的一致使用。
参考:Rails文档中的控制器命名规范

1

当我使用单数形式的控制器名称时,我感觉更好。


1

使用复数形式听起来更好,如果您有一个处理单个资源(例如用户)的控制器,则仍然可以将URL命名为/user。

使用帮助程序通常不需要为每个控制器创建一个帮助程序,并且通常会有帮助程序方法可用于跨多个控制器使用,而不是将它们全部放在应用程序帮助程序中,您可以将它们放在自定义帮助程序中,例如layout_helper或任何其他良好命名的文件。


和Can Berk Guder留言的一样,我也有些困难理解你最后一句话/段落,因为标点符号太少了! - allyourcode
1
抱歉,我的意思是可能最好创建自定义helper而不是使用默认的。因为默认的名称并不总是完全捕捉到它们将被使用的位置。如果您有一些将用于布局的helper方法,请称其为layout_helper。 - nitecoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接