Rails模块名称与首字母缩略词变形

时间:2014-10-21 11:23:20

标签: ruby-on-rails

看起来变形对于嵌套级别不止一个的模块名称不起作用。

如果您的config/initializers/inflections.rb

中有以下内容:
ActiveSupport::Inflector.inflections do |inflect|
  inflect.acronym 'VCloud'
end

然后当您在app/下创建目录时,说app/services/vcloud/,您将获得两个模块:

Vcloud #=> Vcloud
VCloud #=> VCloud

但是如果你创建一个具有更高嵌套级别的目录,比如app/services/vmware/vcloud/,你将只得到一个模块:

Vmware::Vcloud #=> Vmware::Vcloud
Vmware::VCloud #=> NameError: uninitialized constant Vmware::VCloud

这是一个错误吗?

2 个答案:

答案 0 :(得分:2)

我会选择这是一个错误。您可以使用(在初始化程序内):

module ActiveSupport::Inflector
  def underscore_with_acronym_fix(string)
    words = string.split('::')
    return words.map(&method(:underscore)).join('/') unless words.one?
    underscore_without_acronym_fix(string)
  end

  alias_method_chain :underscore, :acronym_fix
end

我会做一个拉动请求来解决这个问题,但需要稍微多一些时间来确认它不会破坏任何东西。这里有很多案例。

答案 1 :(得分:0)

我想知道我是否可以复制这个“问题”。

尝试了这个运行rails控制台。

> ActiveSupport::Inflector.camelize 'vcloud' => "Vcloud"

> ActiveSupport::Inflector.camelize 'v_cloud' => "VCloud"

下面列出了各种组合的测试用例。

http://api.rubyonrails.org/classes/ActiveSupport/Inflector/Inflections.html#method-i-acronym

https://github.com/rails/rails/blob/master/activesupport/test/inflector_test_cases.rb