質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

640閲覧

[Ruby] 複数形を単数系に変換

ruby_11

総合スコア37

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/07/11 04:22

Ruby において、複数形を単数系に変換するメソッドsingularizeを使いたいのですが、以下のエラーになります。

どうすれば解決できるでしょうか?

<main>': undefined method pluralize' for main:Object (NoMethodError)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

私の場合はrequire 'active_support/core_ext'と書くと

cannot load such file -- active_support/core_ext (LoadError)

と表示されます。

これを書かないで

'posts'.singularize

とだけ書くと

undefined method `singularize` for "posts":String

というエラーが発生します。

Railsに同梱されている機能というのが存在するのか
どうかわかりませんがRuby単体には存在しない
機能なのではないかなぁと私は予想しています。

私のRubyのバージョンなど
Ruby 2.2.6 Windows32bit版

PHP 複数形を単数形に変換 - サンプルコード
こちらのページに書いてあるコードをRubyに書き換えてみました。

Ruby

1# encoding: utf-8 2 3class String 4 def singularize 5 P2S.singular_by_plural(self) 6 end 7end 8 9class P2S 10 attr_reader :word 11 12 @irregular_rules = { 13 'men' => 'man', 14 'seamen' => 'seaman', 15 'snowmen' => 'snowman', 16 'women' => 'woman', 17 'people' => 'person', 18 'children' => 'child', 19 'sexes' => 'sex', 20 'moves' => 'move', 21 'databases' => 'database', 22 'feet' => 'foot', 23 'cruces' => 'crux', 24 'oases' => 'oasis', 25 'phenomena' => 'phenomenon', 26 'teeth' => 'tooth', 27 'geese' => 'goose', 28 'atlases' => 'atlas', 29 'corpuses' => 'corpus', 30 'genies' => 'genie', 31 'genera' => 'genus', 32 'graffiti' => 'graffito', 33 'loaves' => 'loaf', 34 'mythoi' => 'mythos', 35 'niches' => 'niche', 36 'numina' => 'numen', 37 'octopuses' => 'octopus', 38 'opuses' => 'opus', 39 'penises' => 'penis', 40 'equipment' => 'equipment', 41 'information' => 'information', 42 'rice' => 'rice', 43 'money' => 'money', 44 'species' => 'species', 45 'series' => 'series', 46 'fish' => 'fish', 47 'sheep' => 'sheep', 48 'swiss' => 'swiss', 49 'progress' => 'progress', 50 'nonsense' => 'nonsense' 51 }.freeze 52 53 @singular_rules = { 54 '(quiz)zes$' => '\1', 55 '(matr)ices$' => '\1ix', 56 '(vert|ind)ices$' => '\1ex', 57 '^(ox)en' => '\1', 58 '(alias|status)es$' => '\1', 59 '(octop|vir)i$' => '\1us', 60 '(cris|ax|test)es$' => '\1is', 61 '(shoe)s$' => '\1', 62 '(o)es$' => '\1', 63 '(bus)es$' => '\1', 64 '([m|l])ice$' => '\1ouse', 65 '(x|ch|ss|sh)es$' => '\1', 66 'movies$' => 'movie', 67 'series$' => 'series', 68 '([^aeiouy]|qu)ies$' => '\1y', 69 '([lr])ves$' => '\1f', 70 '(tive)s$' => '\1', 71 '(hive)s$' => '\1', 72 '([^f])ves$' => '\1fe', 73 '(^analy)ses$' => '\1sis', 74 '(analy|ba|diagno|parenthe|progno|synop|the)ses$' => '\1sis', 75 '([ti])a$' => '\1um', 76 '(n)ews$' => '\1ews', 77 '(.)s$' => '\1' 78 }.freeze 79 80 def self.singular_by_plural(prural) 81 return @irregular_rules[prural] if @irregular_rules.key?(prural) 82 83 @singular_rules.each do |key, value| 84 return prural.sub(/#{key}/, value) if prural =~ /#{key}/ 85 end 86 87 nil 88 end 89end 90 91puts 'computers'.singularize # => computer 92

参考にしたページ
【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数
Rubyで逆ポーランド記法の計算機と変換器を作った

progressとnonsenseは追加しました。

投稿2017/07/11 09:24

編集2017/07/11 13:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/07/11 10:52

どちらにしても、事前にgem install activesupportが必要です(他のgemを入れたらついでに入ることも多いですが)。
退会済みユーザー

退会済みユーザー

2017/07/11 11:13

そうですね。私のgem listには activesupportが出てこないのでそれが原因だと思います。 質問者様も同じような状況の可能性が考えられますね。
ruby_11

2017/07/12 07:18

プログラムとご指摘ありがとうございます。 activesuppotはすでにインストールされていました。 NCC1701さんが言われたように、allをつけるとうまく処理されました。
退会済みユーザー

退会済みユーザー

2017/07/12 09:45

おぉ、よかったですね。
guest

0

.singularizeStringのめそっどなので、'posts'.singularizeのように使います(参考)。

投稿2017/07/11 05:01

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruby_11

2017/07/11 05:06

解答ありがとうございます。 しかし、そのように入力してもうまく実行されません。
maisumakun

2017/07/11 05:08

何かエラーとかは出ていますか?
ruby_11

2017/07/11 05:10

undefined method `singularize` for "posts":String と、エラーが出ています。
maisumakun

2017/07/11 05:11

require 'active_support'の次の行に「require 'active_support/core_ext'」というのが必要なようです。
ruby_11

2017/07/11 05:17

core_extを追加してみると、わけのわからないエラーが数行出てきました。 `<module:NumberH elper>': uninitialized constant ActiveSupport::Autoload (NameError) `<m odule:ActiveSupport>'
NCC1701

2017/07/11 08:46

require "active_support/all"で
ruby_11

2017/07/12 07:16

require "active_suppor/all" でうまく処理されました。 ありがとうございます。
ruby_11

2017/07/12 07:20

ちなみになんですが、なぜ/allを加えることで解決されたのでしょうか?
guest

0

実際に実行したコードを見せて下さいませんか?

投稿2017/07/11 04:26

go55555

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruby_11

2017/07/11 04:52

require 'active_support pluralize('posts') と書きました。
go55555

2017/07/11 05:05

"posts".singularize でどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問