Rails 在搭建脚手架时将 slave 更改为 slafe

Rails changes slave to slafe when scaffolding

我正在尝试生成一个名为 "slave" 的脚手架。当我 运行 命令 rails generate scaffold slave rails 将脚手架的某些部分从 slave 更改为 slafe。例如,受影响的是资源路线。

为什么会发生这种情况,我该如何解决这个问题?

我在 RubyMine 上使用 Rails 5.0.2 和 JRuby。

正如@omnikron 所说,您可以尝试在文件 config/initializers/inflections.rb:

中强制执行 "irregular" 拐点
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'slave', 'slaves'
end

发生这种情况是因为词形变化不正确。 Rails 词形变化采用一种放之四海而皆准的方法,这种方法在大多数情况下都有效,但由于英语复数化有多么奇怪,它常常会让您不知所措。在你的例子中,复数 'slaves' 是从你的输入 'slave' 正确生成的,但是在路由助手生成期间 rails 显然需要 'slaves' 的单数版本并确定 'slafe' 因为 this inflection rule:

inflect.singular(/([^f])ves$/i, 'fe')

要解决此问题,只需添加您自己的规则:

# config/initializers/inflections.rb
ActiveSupport::Inflector.inflections do |inflect|
  inflect.singular('slaves', 'slave')
end

...运行 生成器又开始工作了:

$ rake routes | grep slave
                       slaves GET      /slaves(.:format)                                                   slaves#index
                              POST     /slaves(.:format)                                                   slaves#create
                    new_slave GET      /slaves/new(.:format)                                               slaves#new
                   edit_slave GET      /slaves/:id/edit(.:format)                                          slaves#edit
                        slave GET      /slaves/:id(.:format)                                               slaves#show
                              PATCH    /slaves/:id(.:format)                                               slaves#update
                              PUT      /slaves/:id(.:format)                                               slaves#update
                              DELETE   /slaves/:id(.:format)                                               slaves#destroy

顺便说一句,完全相反的问题可能是由 this rule:

引起的
inflect.plural(/(?:([^f])fe|([lr])f)$/i, 'ves')

...这会导致问题,例如 rails generate scaffold cafe - 所有应该是 'cafes' 的东西都会变成 'caves'。啊!