Ruby on rails Rails中的控制器和助手名称的单数或复数形式

Ruby on rails Rails中的控制器和助手名称的单数或复数形式,ruby-on-rails,naming-conventions,Ruby On Rails,Naming Conventions,控制器和助手使用单数名称是否有任何缺点?似乎没有什么可以依赖于此。至少根据我有限的实验,助手们似乎不必像他们相应的控制器一样,对单数和复数做出相同的选择。这是真的吗?对控制器使用复数名称只是一种惯例 复数名称通常听起来更自然(特别是对于直接绑定到特定模型的控制器:User->Users等),但您可以使用任何您想要的名称 至于助手,默认情况下所有控制器都可以使用所有助手,因此从技术上讲,如何命名助手根本不重要。这只是另一种约定,将控制器的助手函数保留在与控制器同名的助手中。使用复数听起来更好,如果

控制器和助手使用单数名称是否有任何缺点?似乎没有什么可以依赖于此。至少根据我有限的实验,助手们似乎不必像他们相应的控制器一样,对单数和复数做出相同的选择。这是真的吗?

对控制器使用复数名称只是一种惯例

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


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

使用复数听起来更好,如果您有一个处理单个资源(即用户)的控制器,那么您仍然可以命名url/用户


对于助手,通常不需要为每个控制器配备助手,通常会有一些助手方法,您可以使用多个控制器,而不是通过应用程序助手将它们全部丢弃。您可以将它们放在自定义助手中,而不是像布局助手或任何其他命名良好的文件中。

当我使用单数作为控制器名称时,我感觉更好。

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

肯定复数

具有restful路由和奇异控制器 控制器:

dog_controller.rb  
dogs_controller.rb
路线:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  
map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  
使用复数控制器 控制器:

dog_controller.rb  
dogs_controller.rb
路线:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  
map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  
rails生成控制器--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

您在Rails指南中有一个非常完整的解释:

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

我目前正在开发的Rails应用程序就属于这一类,Rails希望我在一个地方定义为单数的标识符在其他地方以复数形式使用,这让我很恼火。例如,我可能想在
config/routes.rb
中定义类似的内容:

  resource :dashboard, :only => [:show]
然后我需要一个控制器
DashboardController
来显示有关应用程序某些方面的摘要信息,从多个数据库表收集信息。因此,这里,
仪表板
不涉及应用程序的任何模型,而且将控制器的名称命名为
仪表板控制器
会很奇怪

我找到了一个很好的解决办法,解决了中国自动多元化的烦恼。简言之,编辑文件
config/initializers/endocations.rb
,并将不希望自动复数的单词添加到此定义中:

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

如果控制器是一个资源,那么它必须是复数

比如说

控制器

articles_controller.rb
模型

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

welcome_controller.rb

Rails中控制器的命名约定有利于控制器名称中最后一个单词的复数化,尽管不是严格要求的(例如
ApplicationController

例如,
clientscoontroller
优于
ClientController
SiteAdminsController
优于
SiteAdminControlle
r或
SiteAdminsController
,等等

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


Ref:

如果用户对应的控制器就是用户控制器,不是更自然吗??此外,如果您依赖于默认路由,则会得到类似于/users/edit的url,这看起来像是在编辑所有用户。对我来说,这一点都不自然。@allyourcode:嗯,我想这都是主观的。对我来说,让/users列出所有用户比/user更自然。哦,这是一种RESTful方式。@Can“RESTful方式”听起来像是一首崇拜的圣歌。不过,这并不让我感到惊讶,因为Rails总体上相当虔诚。我喜欢Rails对REST的痴迷,但默认路由不是restful。即使配置RESTful路由也是不自然的。在连接的第二个参数中包括:conditions=>{:method=>:post}没有任何意义,因为散列应该指定如何处理与当前规则匹配的任何请求,而不是指定任何给定请求是否与当前规则匹配。@根据编辑的默认路由,所有您的代码都是/users/:id/edit,而不是/users/edit。对我来说,说“在所有用户中,用id:id编辑用户”听起来很自然。和Can Berk Guder的评论一样。此外,我在理解你的最后一句/段落时遇到了一些问题,因为标点符号太少了!对此很抱歉,我的意思是,创建自定义帮助程序可能比使用默认帮助程序更好,因为默认帮助程序的名称并不总是完全捕获它们将要使用的位置。如果您有许多将用于