目的
例えば knowledge リソースを扱いたい場合に url が /knowledges となってしまうのを /knowledge にしたい
方法
config/initializers/inflections.rb
へ追加する
rails new APP_NAME
で生成されるconfig/initializers/inflections.rb
のコメントに書いてある通り。
knowledge を追加したい場合は、以下のようにする。
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.uncountable %w( knowledge )
end
これを設定することで knowledge が不可算名詞扱いとなり、pluralize
, singularize
の結果が knowledge のままとなる。以下はrails c
の結果。
# before
irb(main):001:0> 'knowledge'.pluralize
=> "knowledges"
# after
irb(main):001:0> 'knowledge'.pluralize
=> "knowledge"
scaffold の実行結果も変わります。controller の名前が knowledges_controller から knowledge_controller になる。route も変わるので url が /knowledge になってスッキリ。
# before
$ rails g scaffold Knowledge
invoke active_record
create db/migrate/20140528134235_create_knowledges.rb
create app/models/knowledge.rb
invoke test_unit
create test/models/knowledge_test.rb
create test/fixtures/knowledges.yml
invoke resource_route
route resources :knowledges
invoke scaffold_controller
create app/controllers/knowledges_controller.rb
invoke erb
create app/views/knowledges
####### 以下省略 #######
# after
$ rails g scaffold Knowledge
invoke active_record
create db/migrate/20140528134451_create_knowledge.rb
create app/models/knowledge.rb
invoke test_unit
create test/models/knowledge_test.rb
create test/fixtures/knowledge.yml
invoke resource_route
route resources :knowledge
invoke scaffold_controller
create app/controllers/knowledge_controller.rb
invoke erb
create app/views/knowledge
####### 以下省略 #######
余談
一部の単語は rails 側で登録されている。
https://github.com/rails/rails/blob/b22b1882238b08ed341bebc32335b6b6f6f64dfb/activesupport/lib/active_support/inflections.rb#L68
メモ
-
ActiveSupport::Inflector
がpluralize
系の解決をする -
ActiveSupport::Inflector
は不可算名詞だけじゃなく、people, person などの不特定のケースも対応できる
動機
Rails のレールに乗るからには仕方ないのか?ってのが気になって調べた。もしかしたら後で困ったときに使いそうなのでメモした。