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

all*_*ode 110 ruby-on-rails naming-conventions

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

jpg*_*eek 155

绝对是复数.

具有宁静的路由和独特的控制器

控制器:

dog_controller.rb  
Run Code Online (Sandbox Code Playgroud)

路线:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  
Run Code Online (Sandbox Code Playgroud)

使用多个控制器

控制器:

dogs_controller.rb
Run Code Online (Sandbox Code Playgroud)

路线:

map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 同意.控制器的Rails 3.1生成器帮助消息使用"CreditCard"(单数)作为示例令人困惑. (23认同)
  • Rails现在使用复数:rails生成控制器CreditCards打开借记卡贷款关闭 (4认同)
  • 在这里仍然有单一的CreditCard:http://guides.rubyonrails.org/command_line.html#rails-generate (3认同)

Can*_*der 26

对控制器使用多个名称只是一种惯例.

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

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

  • 对应于User的控制器是不是更自然的UserController?此外,如果你依赖默认路由,你会得到看起来像/ users/edit的网址,看起来你正在编辑所有用户.对我来说,这根本不是很自然. (10认同)
  • @allyourcode:嗯,我想这都是主观的.对我来说,拥有/用户列出所有用户比/ user更自然. (5认同)
  • @Can"RESTful way"听起来像一个邪教颂歌.然而,这并不让我感到惊讶,因为Rails在整体上非常虔诚.我喜欢Rails如何着迷于REST,但默认路由并不安宁.即使配置RESTful路由也不自然.包括:conditions => {:method =>:post}在第二个连接参数中是没有意义的,因为哈希应该指定如何处理与当前规则匹配的任何请求,而不是_whether_任何给定的请求与当前规则匹配. (3认同)
  • @allyourcode根据[this](http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default)编辑的默认路线是/ users /:id/edit而不是/ users /编辑.说"在所有用户之外,用id:id编辑用户"对我来说听起来很自然. (2认同)

Rya*_*yan 19

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


Ner*_*ian 12

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

  • 实际上这是正确答案b/c,如果你读它,它解释复数是一组资源的正确答案.对于单例资源,单数是正确的答案.文档中的示例.事实上,这个在其他帖子中得到了很好的回答:http://stackoverflow.com/questions/2614858/ruby-on-rails-differentiating-plural-vs-singular-resource-in-a-rest-api (4认同)

Tee*_*sti 9

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

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

  resource :dashboard, :only => [:show]
Run Code Online (Sandbox Code Playgroud)

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

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

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end
Run Code Online (Sandbox Code Playgroud)


小智 5

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

例如

控制器

articles_controller.rb
Run Code Online (Sandbox Code Playgroud)

模型

article.rb
Run Code Online (Sandbox Code Playgroud)

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

welcome_controller.rb
Run Code Online (Sandbox Code Playgroud)