久々に Padrino で開発していて, データベースには MongoDB, データ永続化層として Mongoid を使っています.

ところがインデックスの作成が上手くできませんでした.
Padrino x Mongoid という構成では, インデックスの作成に以下のコマンドを使います. (長い)

コンソール上では特に問題無く終わったかのようにみえるのですが, 実際は何も起こらずに終わっていました.
MongoDB のコンソールを見ても, 特にインデックスの作成が試みられたようなログは残りません.

調べた所, rake タスク自体に問題がありました.

これはモデルクラスを探索し, 見つかったものを Class オブジェクトの配列として返すものなのですが, モデルクラスのファイルの位置の指定に間違いがあり, 常に空の配列が返って来ていました.
これだと, 探索が行われるのが app/models/*.rb と /models/*.rb となってしまいますが, 実際には models/*.rb を探索する必要があります.

1 Byte の追加でうまく問題が解決しました.
テストはもともと無かったし, ファイルシステムが絡むからめんどいなーと思って書いてません.
すいません…

GitHub で報告したらすぐに取り入れられました.
gem でのリリースはまだですが, これもそんなに時間はかからないと思います.

どうも Padrino のモデルクラスの置き場所が, ./app/models から ./models に移ったようで, そのときの変更のときからずっと壊れていたようです.
多分 7 ヶ月間ずっと動いていなかったみたいなんですが, Mongoid ってあんまり使われていないんでしょうか…

ウェブサービスを作ろうとするとフレームワークのバグにハマり, それの修正で満足してしまって結局ウェブサービスが完成しない, という現象に名前が欲しい.

,

この連休中, RubyPadrino というフレームワークを使って Web サービスを作っています.
その中で Cafe というモデルが必要で, それ用の管理ページを Padrino のコマンドで自動生成したところ, caves という名前のコントローラが生成されてしまいました.

なんとなくカッコ悪いので調べてみたところ, Padrino では, 名詞の複数形変化に, RailsActiveSupport を利用していることがわかりました.
ActiveSupport は, ロード時に String クラスに対していくつかのメソッドを追加しており, pluralize というメソッドで, 名詞の複数形への変換を行います.

pluralize メソッドについては, Padrinoコンソールを使えば簡単に確認できます.
(当然 Rails でもできるとは思いますが, 特に試してはいません)

このように, 不規則変化や, 数えられない名詞にも対応はしているのですが, cafecaves になってしまいます.

そのあたりのルールがどう定義されているかは, ActiveSupport::Inflector.inflections を実行すればわかります.
いくつかルールが出てくるのですが, どうも以下のものが原因のようです.

どうやら **fe という名詞は複数形にすると **ves になる, というルールのようです.
確かに knife の複数形は knives ですし, wife の複数形は wives であり, 先の例でもそのようになっています.
ですが, このルールは cafe には当てはまらないので, ActiveSupport に教えてあげましょう.

Padrino においては, とりあえず ./config/boot.rb の中の Padrino.before_load ブロックの中に記述してみました.

上記の記述を追加したあとで, Padrino のコンソールを再起動し, 再び試してみました.

cafe がちゃんと cafes になるようになりました.
knife や wife のルールもちゃんと適用されています.
モデルの管理画面の自動生成時にも, ちゃんと cafes というコントローラが生成されるようになりました.

めでたしめでたし.

参考にしたページ

, ,