Rails中的单个或多个控制器和帮助器名称

时间:2009-03-14 23:43:18

标签: ruby-on-rails naming-conventions

对控制器和助手使用单数名称有什么不利吗?似乎没有什么依赖于此。它甚至看起来帮助者不必像对应的控制器那样对单数与复数做出相同的选择,至少根据我的有限实验。这是真的吗?

9 个答案:

答案 0 :(得分:152)

绝对复数

使用restful routing和一个奇异的控制器

控制器:

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

答案 1 :(得分:26)

为控制器使用多个名称只是一种惯例。

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

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

答案 2 :(得分:19)

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

答案 3 :(得分:12)

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

答案 4 :(得分:9)

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

我目前正在研究的Rails应用程序属于这一类,对我来说只是一种恼怒,Rails希望我在一个地方定义为单数的标识符然后在其他地方以复数形式使用。例如,我可能想在config/routes.rb中定义类似的内容:

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

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

我找到了this answer中自动复数刺激的良好解决方案。简而言之,编辑文件config/initializers/inflections.rb并将您不希望自动复数的单词添加到此定义中:

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

答案 5 :(得分:2)

当我使用单数用于控制器名称

时,我感觉更好

答案 6 :(得分:2)

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

例如

控制器

articles_controller.rb

模型

article.rb

但是当你没有像

这样的相应模型时,你可以使用奇异的控制器名称
welcome_controller.rb

答案 7 :(得分:2)

Rails中控制器的命名约定有利于控制器名称中最后一个单词的多元化,但并非严格要求(例如{{1 }})。

例如,ApplicationController优于ClientsControllerClientController优于SiteAdminsController r或SiteAdminControlle,依此类推。

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

参考:Controller Naming Convention-Rails Doc

答案 8 :(得分:1)

使用复数只是听起来更好,然后如果你有一个处理单一资源的控制器,即用户,那么你仍然可以命名网址/用户。

使用帮助程序通常不需要为每个控制器都有一个帮助程序,并且通常会有辅助方法,您可以使用ascorss多个控制器,而不是通过您的应用程序帮助程序将它们丢弃,您可以将它们放在自定义帮助程序中,例如layout_helper或任何其他名称很好的文件。