gaaamiiのブログ

悪気なく間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

lib/ から app/controllers/concerns/ へ

yomomo.net にて、Amazon Product Advertising API を叩いて 良い感じの キーバリュー(Hash)オブジェクトを返してもらう処理を、これまでに2回引越しました。

yomomo.net は、Railsの素晴らしいコード生成とRailsで金を稼いだことがない素人同然の僕が設計らしい設計も考えずに作った雑追加実装でできています。そのため、ここにそれ書くの?というものがあちこちに散らばっていて、その一つが今回 ResponseGenerator という名前でmoduleにした部分でした。

ResponseGenerator は冒頭にも書いたように、「外部の書籍情報APIへのアクセスを行い, ハッシュオブジェクトを返す」処理です。以前はこれを app/controllers/items_controller.rb に書いていました(Yomomoの「おすすめ」はコード上では Item というモデルとして存在していて、items_controller.rb はこれに対応するコントローラです)。ただ、考えてみると「外部の書籍情報APIへのアクセスを行い, ハッシュオブジェクトを返す」処理はこのコントローラだけに必要なものというわけではなさそうです。コントローラ全体から利用出来るようにしたい。けれどもApplicationController に処理を生やすというよりはもう少し独立したものとして扱った方が良いような気がしてました。

何より、ApplicationController を見てみたら、404ページをrenderするためのメソッドやら現在のユーザーを返すメソッドやらが生えていて、なんだか秩序が無い雰囲気でした。これ以上散らかしたら、あっという間にぐちゃぐちゃなプログラムになってしまいそうでした。

そこで、よくわからないので lib/ 下に response_generator.rb というファイルを作り、そこにmodule で名前空間を切り、config.autoload_paths += %W(#{config.root}/lib) で lib ディレクトリを読み込むように設定して利用できるようにしました。

(参考) easyramble.com

ただ、app/controllers/ の下に concerns/ というのもあったな、あれはどうやって使うんだと調べていったらこちらの方が適切っぽかったので移動した、というのが今回の流れでした。


書き途中です。