对控制器和助手使用单数名称有任何不利之处吗?似乎没有任何依赖。甚至看来,助手至少在我有限的实验中,不必对单数或复数与其相应的控制器进行相同的选择。真的吗?
对控制器和助手使用单数名称有任何不利之处吗?似乎没有任何依赖。甚至看来,助手至少在我有限的实验中,不必对单数或复数与其相应的控制器进行相同的选择。真的吗?
Answers:
绝对是复数。
控制器:
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
为控制器使用复数名称只是一个约定。
复数名称通常听起来更自然(特别是对于直接绑定到特定模型的控制器:用户->用户等),但是您可以使用任何名称。
至于助手,默认情况下,所有控制器都可使用所有助手,因此从技术上讲,您如何命名助手根本无关紧要。将控制器的助手功能保留在与控制器同名的助手中只是另一种约定。
您在Rails指南中有一个非常完整的解释:http : //edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default
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
尽管并非严格要求(例如),但在Rails中,控制器的命名约定倾向于对控制器名称中的最后一个单词进行复数。ApplicationController
例如,ClientsController
优于ClientController
,SiteAdminsController
优于SiteAdminControlle
r或SitesAdminsController
,依此类推。
遵循此约定,将允许您使用默认的路由生成器(例如资源等),而无需限定每个:path
或:controller
,并且将在整个应用程序中保持URL和路径助手的用法一致。
如果控制器是资源,则它必须是复数形式...
例如
控制者
articles_controller.rb
模型
article.rb
但是,当您没有类似的模型时,可以使用单个控制器名称
welcome_controller.rb
使用复数听起来更好,然后,如果您有一个处理单数资源的控制器(即user),则仍可以将URL命名为/ user。
使用辅助程序时,通常不需要每个控制器都有一个辅助程序,通常会有一些辅助方法,您可以使用多个控制器,而通过应用程序辅助程序将它们全部乱扔,您可以将它们放在自定义辅助程序中,而不是例如layout_helper或任何其他方法。其他命名良好的文件。