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

  • 35
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

目的

例えば 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で単数形を複数形に変換する方法と、その変換がうまく行かない場合の対処法