Posted at

Rails で不可算名詞を扱う方法

More than 5 years have passed since last update.


目的

例えば knowledge リソースを扱いたい場合に url が /knowledges となってしまうのを /knowledge にしたい


方法


config/initializers/inflections.rb へ追加する

rails new APP_NAME で生成されるconfig/initializers/inflections.rbのコメントに書いてある通り。

knowledge を追加したい場合は、以下のようにする。


config/initializers/inflections.rb

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::Inflectorpluralize 系の解決をする


  • ActiveSupport::Inflector は不可算名詞だけじゃなく、people, person などの不特定のケースも対応できる


動機

Rails のレールに乗るからには仕方ないのか?ってのが気になって調べた。もしかしたら後で困ったときに使いそうなのでメモした。


SEE ALSO

Railsで単数形を複数形に変換する方法と、その変換がうまく行かない場合の対処法