Rails中的单数或复数控制器和助手名称


112

对控制器和助手使用单数名称有任何不利之处吗?似乎没有任何依赖。甚至看来,助手至少在我有限的实验中,不必对单数或复数与其相应的控制器进行相同的选择。真的吗?


2
我在决定单数或复数控制器名称时遇到了同样的难题!
安德鲁

15
谢谢:)如果您对这样的事情提出质疑,Rails文化会让您感到愚蠢。
allyourcode

Answers:


158

绝对是复数

带有平稳的路由和单个控制器

控制器:

dog_controller.rb  

路线:

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”(单数)为例。
2011年

4
Rails帮助现在使用复数形式:rails生成控制器CreditCards打开借记卡信用关闭
notapatch 2013年

3
仍然在这里使用单一的
信用卡


因此,命名应为复数形式。例如::rails生成控制器Dogs新索引创建删除销毁编辑“ ??
BKSpurgeon

27

为控制器使用复数名称只是一个约定。

复数名称通常听起来更自然(特别是对于直接绑定到特定模型的控制器:用户->用户等),但是您可以使用任何名称。

至于助手,默认情况下,所有控制器都可使用所有助手,因此从技术上讲,您如何命名助手根本无关紧要。将控制器的助手功能保留在与控制器同名的助手中只是另一种约定。


10
对应于User的控制器不是UserController会更自然吗?另外,如果您依赖默认路由,则会获得类似于/ users / edit的url,看起来就像您正在编辑所有用户。对我来说,那不是很自然。
allyourcode

5
@allyourcode:好吧,我想这都是主观的。对我来说,让/ users列出所有用户比/ user更自然。
Can BerkGüder09年

1
哦,这是REST风格。
Can BerkGüder09年

3
@“ RESTful方式”听起来像是一种教ish。不过,这并不令我感到真正惊讶,因为Rails总体而言非常虔诚。我喜欢Rails对REST的痴迷,但是默认路由并不是很平稳。即使配置RESTful路由也是不自然的。在第二个参数中包括:conditions => {:method =>:post}以进行连接是没有意义的,因为哈希应指定如何处理与当前规则匹配的任何请求,而不是指定给定的请求是否与当前规则匹配。
allyourcode

2
@allyourcode根据这个要编辑的缺省路由/用户/:ID /编辑而不是/用户/编辑。我说“在所有用户中,用id:id编辑用户”听起来很自然。
DavidG

19

模型是单数的,因为它引用了单个对象(例如User)。控制器是复数形式,因为它是用于收集用户的控件(方法)。路线的命名方式完全取决于该个人开发者。我从来没有用户抱怨过Web请求的URL是单数还是复数。最终结果是在为最终用户提供质量页面显示或API请求时为当前和将来的贡献者保持通用约定。


12

您在Rails指南中有一个非常完整的解释:http : //edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
实际上,如果您读过b / c,这是正确的答案,这说明复数是资源集合的正确答案。对于单例资源,单数是正确的答案。文档中的示例。而实际上,这是很好回答这个其他职位:stackoverflow.com/questions/2614858/...
罗布

像这篇文章这样的官方参考支持的答案对新手有很大帮助!谢谢
Wasif Hossain

9

Rails约定,一个控制器处理一个模型,无论该模型的一个或多个实例是否可以在运行时存在。但是,您可以拥有一个Rails应用程序,其中(某些)控制器(和关联的视图)不与任何特定模型关联,而是处理一组更复杂的功能。在这种情况下,自动复数没有任何意义。

我目前正在使用的Rails应用程序就属于此类,对我来说,Rails希望在一个地方定义为单数的标识符在其他地方以复数形式使用对我来说只是一个刺激。例如,我可能想在中定义如下内容config/routes.rb

  resource :dashboard, :only => [:show]

然后,我希望控制器DashboardController显示有关应用程序某些方面的摘要信息,并从多个数据库表中收集信息。因此,在这里,Dashboard它没有引用应用程序的任何模型,而将控制器的名称命名为be将会很奇怪DashboardsController

这个答案中,我找到了解决自动复数问题的好方法。简而言之,请编辑文件config/initializers/inflections.rb并将不需要的单词添加到此定义中:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end

3

尽管并非严格要求(例如),但在Rails中,控制器的命名约定倾向于对控制器名称中的最后一个单词进行复数ApplicationController

例如,ClientsController优于ClientControllerSiteAdminsController优于SiteAdminController或SitesAdminsController,依此类推。

遵循此约定,将允许您使用默认的路由生成器(例如资源等),而无需限定每个:path:controller,并且将在整个应用程序中保持URL和路径助手的用法一致。

参考:Controller Naming Convention-Rails Doc


2

使用单数表示控制器名称时感觉更好


2

如果控制器是资源,则它必须是复数形式...

例如

控制者

articles_controller.rb

模型

article.rb

但是,当您没有类似的模型时,可以使用单个控制器名称

welcome_controller.rb

1

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

使用辅助程序时,通常不需要每个控制器都有一个辅助程序,通常会有一些辅助方法,您可以使用多个控制器,而通过应用程序辅助程序将它们全部乱扔,您可以将它们放在自定义辅助程序中,而不是例如layout_helper或任何其他方法。其他命名良好的文件。


与Can Berk Guder的评论相同。另外,由于您的标点符号太少,我在您最后一句话/段后面有些麻烦!
allyourcode

1
抱歉,我的意思是创建自定义助手而不是使用默认助手是个更好的主意,因为默认助手的名称并不总是能完全捕获要使用的助手。如果您有许多用于布局的辅助方法,则将其称为layout_helper。
nitecoder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.