问题 使用型号名称中的大写字母覆盖Rails控制器路由


我想在rails中创建一个模型:

rails generate model ABCThing

所以这将创建一个表, abc_things。大。问题出在控制器和路由上。我希望我的控制器是:

class ABCThingsController < ApplicationController
end

但是,加入之后 routes.rb

resources :abc_things, :only => [:index]

并创建相应的 index 查看,我在浏览器中收到以下错误:

Expected /app/controllers/abc_things_controller.rb to define AbcThingsController

问题很容易看出("ABCThings".tableize.classify => "AbcThing"),但我不太确定如何解决它。我想覆盖从视图到控制器的rails默认路由,但我不知道如何。

非常感谢任何帮助(以及更好的问题标题的建议!)


1030
2017-09-20 08:51


起源

我可以问你为什么要这样做?约定是RoR的优势之一,为什么打破它们呢? BTW型号名称不应为复数。 - cthulhu
模型生成中的复数是一个错字,但你肯定会欣赏有无数的三个字母的首字母缩略词,只有首字母缩略词的首字母大写不会产生很多语法意义 - rwb
@cthulhu出于同样的原因Rails支持变形。他们应该是 公约而不是法律。 - mahemoff


答案:


在尝试了上述所有解决方案后,我遇到了这个问题;能够使用变形器修复我的问题。

在我的情况下,问题是 TLA::ThingsController 正在被解决为 TlaThingsController

将以下内容放入我的初始化文件夹中修复它

config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'TLA'
end

13
2018-02-25 13:40



这是Rails的方式,应该被赞成。谢谢 - rwb


您应该在routes.rb中设置自定义控制器名称:

resources :abc_things, :only => [:index], :controller => "ABCThings"

2
2017-09-20 11:39



相同的错误消息。我也认为你的意思 :controller => "ABCThings" - rwb
哦,对不起,是的,只有没有“控制器”部分的名称,现在编辑 - byterussian
现在,这将产生一个警告,按照 导轨指南:“仅支持目录表示法。使用ruby常量表示法指定控制器(例如, :controller => 'Admin::UserPermissions')可能导致路由问题并导致警告。“ - Michael Stalker
由于现在“只支持目录通知”,我完成了我想要的方式:在控制器处 app/controllers/abc_things_controller.rb 定义 ABCController 上课,然后在路线上说: resources :abc_things, controller: "a_b_c_things"。似乎在Rails 4.2.7中工作 - Nathan Wallace


这可能在某些时候已经改变了Ruby,但是对于连续命名具有多个大写字母的类(首字母缩写词或首字母缩写词),您不再需要在文件名中包含下划线。

# abc_thing.rb

可以包含

class ABCThing

  def hello
    puts "Hello World"
  end

end

要么

class AbcThing

  def hello
    puts "Hello World"
  end

end

2
2017-12-09 18:28





当你运行命令

rails generate model ABCThings

它将生成模型而不是控制器。 如果你想要模型和控制器使用以下

rails generate scaffold ABCThings

我认为你不是通过使用rails命令生成控制器,因此出现了问题 生成控制器使用以下命令

rails generate controller ABCThings

你可以 /app/controllers/abc_things_controller.rb 如下

class AbcThingsController < ApplicationController
end

-1
2017-09-20 09:00



咦?我手动创建了控制器。我希望有 class ABCThingsController < ApplicationController 不 class AbcThingsController < ApplicationController - rwb