#5 「今年お世話になったgem その2」 tech.kayac.com Advent Calendar 2013

こんにちは、@hilotter です。

このエントリーはtech.kayac.com Advent Calendar 2013の5日目のエントリーです。

昨日の「#4 今年お世話になったgemその1」にもありましたが、弊社クライアントワーク事業部ではバックエンドにRailsを用いる案件が多くあります。

本日のエントリーでは昨日に続きまして、今年1年間クライアントワークプロジェクトでお世話になったgem残り5選の紹介とそれらの簡単なtipsをご紹介したいと思います!

今回ご紹介するgem

  • settingslogic : 定数を一元管理できます
  • omniauth : 外部サービス認証を手軽に組み込めます
  • resque : ジョブキュー処理を手軽に実現できます
  • tire : 全文検索エンジンelasticsearchにrubyからアクセスできるようになります
  • active_admin : サクッと管理画面が作れます

手前味噌で恐縮ですが、先日リリースした悩みに対して音楽で回答するサービス 「オンガクスリ」は、今回ご紹介するtireやresqueを用いて検索機能を実現しています。

もしよかったらサイトにアクセスして触ってみてください!

それでは、早速いってみましょう。

settingslogic

まず1つ目にご紹介するのは、 settingslogic です。

アプリケーション開発が進んでくると定数がコード内に散らばってしまいがちです。

小規模なアプリケーションであれば定数を直接コード内に書いていても大きな問題になることはないかもしれませんが、複数人で開発を行っていたり、アプリケーションの規模が大きくなってきた場合、定数が一カ所にまとまっていないと思わぬバグが発生する原因となってしまいます。

そんな時、settingslogicを使うとsettings.ymlという設定ファイルに定数を一元管理できます。

railsでsettingslogicを使用する場合、config/initializers以下にsettingslogicの初期設定ファイルを設置します。

この際に注意しておくことは、他のinitialier内でsettingslogicの定数を呼び出そうとした場合に、先にsettingslogicのinitialierが読み込まれていないとエラーになってしまいます。

私が普段使用する際は、ファイル名の先頭に0をつけることで一番最初にsettingslogicのinitializerが読み込まれるようにしています。

# config/initializers/0_settings.rb

class Settings < Settingslogic
  source "#{Rails.root}/config/settings.yml"
  namespace Rails.env
end

settingslogicを使えば定数を一元管理できますし、開発環境、本番環境、と環境に応じて値を変更することができるので便利です。

具体的な使用方法に関しては「Railsで定数を一元管理する(settingslogic)」にまとめましたのでご参照いただければと思います。

omniauth

2つ目にご紹介するのは、外部サービス認証を手軽に組み込めるようになる omniauth です。

ominiauthにはそれぞれの外部サービス毎に “ominiauth-#{サービス名}” というgemがあり、Twitter認証の場合は omniauth-twitter 、Facebook認証の場合は omniauth-facebook を併せて使用します。

gemのインストール後、config/initializers/omniauth.rb に

# config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  # twitter認証
  provider :twitter, Settings.twitter.consumer_key, Settings.twitter.cunsumer_secret
  
  # facebook認証
  provider :facebook, Settings.facebook.app_id, Settings.facebook.app_secret
end

を設置することでtwitter認証とfacebook認証が組み込まれます。

あとはrouting設定と共通の認証用コントローラを作成すれば外部サービス認証が可能になります。

omniauthを使ったtwitter認証に関しては、「RailsでOmniauthを使ってTwitterログインする」にまとめましたのでご参照いただければと思います。

また、TwitterAPIを手軽に扱える twitter gemと組み合わせることで 「OmniAuthで認証した後に、tweetしたりfollowしたりする」 ことも可能です。

外部サービス認証を手軽に導入できるので大変お世話になっています。

resque

3つ目にご紹介するのは、ジョブキュー処理処理を手軽に実現してくれる resque です。

とりあえずレスポンスだけ返して実際の処理は後回しにしたい、という場合にはresqueが使えます。

具体例を挙げますと、先ほどチラッとご紹介させていただいた「オンガクスリ」では全文検索エンジンである elasticsearch を用いて、ユーザから投稿された悩みの検索機能を実現しています。 (elasticsearchは次にご紹介するtireを用いて操作しています)

ユーザからの悩みが新たに投稿されたり、悩みが削除された場合はelasticsearchのindexも併せて追加したり削除したりする必要があるのですが、この時indexの再構築が終わってからユーザにレスポンスを返すのでは時間がかかってしまうので、index再構築処理をresqueに丸投げしてユーザにはすぐレスポンスを返すようにしています。

また、悩みに誰かがオンガクスリを投稿してくれると悩みの作成者に通知を送るようになっているのですが、こちらも投稿完了時に通知を送るのではなく、投稿完了時はresqueに通知処理を依頼するだけにしてレスポンスを素早く返せるようにしています。

resqueの導入方法、サンプルコードに関しましては、 「Hello World Resque (Railsにresqueを導入する)」 にまとめましたのでご参照いただければと思います。

なお、resqueの最新バージョンは2.x系ですが、デフォルトでインストールされるのは1.1系ですので1.x系での解説をしています。

tire

続いて4つ目にご紹介するのは、全文検索エンジン elasticsearch を利用するためのgem tire です。

オンガクスリ」ではtireを用いて検索機能を実現しています。

昨日の記事でも紹介させていただいた kaminari と組み合わせることで簡単に検索結果のpager機能を作成することができます。

なお、elasticserach用のgemに関しては、2013年の9月にelasticserachの公式gemとして elasticsearch-ruby が登場したため、tireはretireになったとtireの公式サイトに書かれています。(tire自体は今後もそのまま使えるそうです)

また、elasticsearch-ruby自体は登場してから日が浅いため、tireで使える機能がすべて実装されているわけではないとのことです。

tireの導入方法、サンプルコードに関しては「Hello World Tire (Railsにtireを導入する)」にまとめましたのでご参照いただければと思います。

また、3つ目にご紹介したresqueを用いてelasticsearchのindexを非同期で更新する方法に関しては「elasticsearchのindex更新を非同期に行う(tire + resque)」にまとめました。

active_admin

5つ目、最後にご紹介するのはオシャレな管理画面を手軽に作成することのできる active_admin です。

Gemfileにactiveadminを追加しgemをインストールした後、以下を実行します。

./bin/rails g active_admin:install 

管理画面作成に必要な機能がインストールされます。

DBにも変更が加わっているのでmigrateを実行後、/adminにアクセスすれば管理画面の認証ページが表示されます。

TopicというモデルがあったとしてCRUD機能を持つ管理画面を作りたい、という場合は

./bin/rails g active_admin:resource topic

を実行すればTopicモデルの管理画面が生成されます。

手軽ですね。

active_adminのインストール方法、カスタマイズ方法に関しては @Konboi がまとめてくれていますのでご参照いただければと思います。

active_adminの管理画面は柔軟にカスタマイズすることが可能なので、管理画面開発時に必須のgemとなっています。

まとめ

昨日に続きまして、今年お世話になったgem 5つをご紹介させていただきました。

振り返ってみてgemの力にお世話になっている部分が本当に大きいなと感じました。

巨人の肩の上に立つだけではなく、自分も誰かの役に立てるものを作ろうと改めて思います。

さて明日は、社内Unity勉強会を率先して開催してくれている新卒エンジニア @p_chin です。

お楽しみに!