#22 普段からRailsプロジェクトで使っている10個の便利Gem

この記事は tech.kayac.com Advent Calendar 2014 22日目です。

こんにちは。Rubyを書いている @yumiyon です。

今回は、Railsプロジェクトで「○○がしたい!」と思った際に、自分がよく利用するGemを機能ごとに分けて10個ほどご紹介します。日頃からRailsで開発を行なっている方は既知のものばかりかもしれませんが、Railsを始めたばかりの方や、自分のための備忘録として。

目次

  • Gemとは
  • 1、画像をアップロードしたい(CarrierWave)
  • 2、管理画面を作成したい(ActiveAdmin)
  • 3、環境毎に定数を管理したい(rails_config)
  • 4、crontabを管理したい(Whenever)
  • 5、スプレッドシートにアクセス(google_drive)
  • 6、ページャーを実装したい(kaminari)
  • 7、非同期処理を使いたい:ジョブキュー(sidekiq)
  • 8、スクレイピングしたい(Mechanize)
  • 9、ソーシャル上でシェアされた数を取得(social_counter)
  • 10、Amazonで商品を検索(amazon-ecs)
  • 最後に

Gemとは

そもそも「Gem」とは、Rubyで書かれたライブラリやアプリケーションを、パッケージ化したもののことを指します。GemはRubyGemsと呼ばれるパッケージ管理システムを利用して、好きなGemをインストールすることができます。

gems.png

それではさっそく機能ごとに紹介していきます。

1. 画像をアップロードしたい(CarrierWave)

# Gemfile
source 'https://rubygems.org'

gem 'carrierwave'
gem 'fog'
gem 'rmagick'

CarrierWaveは、画像アップロードする際に利用する便利なgemです。

RMagick を使うことができるので、画像処理でリサイズなどちょっと凝ったことをすることもできます。さらにfogというGemを利用すれば、Amazonが提供するS3に、簡単にアップロードすることも可能です。

使い方はこちらにまとめました。 Railsで画像をリサイズしてS3にアップロードする方法

公式リポジトリ

CarrierWave
fog
RMagick

使い方

Railsで画像をリサイズしてS3にアップロードする方法

2. 管理画面を作成したい(ActiveAdmin)

gem 'activeadmin', github: 'gregbell/active_admin’ 

続いてご紹介するのは、Railsプロジェクトで管理画面を簡単に作成できるGemパッケージ「Active Admin」です。

非エンジニアでも簡単にデータにアクセスできりようにするために、管理画面は何かと必要になることが多いと思います。カスタマイズがしやすくデザインも整っているので、今回はRailsAdminではなくActive Adminを選びました(githubのstarの数も少しactiveadminの方が多かったり)。

画面イメージ

activeadmin01.png

ライブラリを追加するだけで、CRUD(データの作成、読み出し、更新、削除)の機能が使えるようになります。また、検索やレコードをCSV、XML、JSON形式で出力することができるので便利です。ライブラリを追加した際に、管理者ログインの機能も一緒に追加されます。

インストールなどの手順はこちらにまとめました。 Railsでシンプルな管理画面をサクッとつくれる「ActiveAdmin」

公式リポジトリ

Active Admin
Active Admin Wiki

使い方

Railsでシンプルな管理画面をサクッとつくれる「ActiveAdmin」

3. 環境毎に定数を管理したい(rails_config)

gem ‘rails_config'

Settingslogic というGemでもいいのですが、管理する定数の数が増えてきた時にも対処するため、最近では環境ごとにファイルを分けられる「rails_config」を利用しています。

開発環境ごとに、定数をYAMLファイルで管理できます。使用したい環境に応じて編集するファイルを変更できるのが特徴的。環境ごとに読み込む定数を変更できるので便利です。

rails_config.png

使い方

Railsで定数を環境ごとに管理するrails_config

公式リポジトリ

rails_config

4. crontabを管理したい(Whenever)

gem 'whenever', :require => false

Railsプロジェクトで、バッチ処理を書く際に便利なGemが「Whenever」です。

cronのバッチを作成して、定期的にバッチ回すことができます。Capistranoでのデプロイする際のCapistranoのレシピなんかも用意されているので、本番環境のcrontabへの設定反映もスムーズです。使い方はこちらにまとめました。 Railsで定期的にバッチ回す「Whenever」

$ bundle exec wheneverize . 
    [add] writing `./config/schedule.rb'
    [done] wheneverized! 

上記のコマンドをたたいて設定ファイル(config/schedule.rb)を作成して、設定を記述していきます。

require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, 'log/cron.log'

# 1分毎に回す
every 1.minute do
  command "echo 'test'"
end

あとはcrontabに反映させれば完了です。

# cronにデータを反映
$ bundle exec whenever --update-crontab 

# cronからデータを削除
$  bundle exec whenever --clear-crontab

CapistranoでWhenever

デプロイ時に、本番環境にもcronの値をセットしたい時は、Capistranoの設定ファイルに下記を追記します。

# config/deploy.rb

set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"

これで cap deploy を行なえば、デプロイ先のcrontabに値が反映されます。

公式リポジトリ

Whenever

使い方

Railsで定期的にバッチ回す「Whenever」

5. スプレッドシートにアクセス(google_drive)

gem 'google_drive'

Googleのスプレッドシートは、Excel代わりに使えたりと何かと便利です。

sp.png

スプレッドシートをrubyで自由にアクセスして操作できたら… なんて時は「google_drive」というGemが使えます。 Google Drive の spreadsheet に、rubyでアクセスしたい時に使える便利Gemです。

使い方はこちらにまとめました。 Google DriveのスプレッドシートにRubyでアクセスする方法

OAuth2.0を利用してアクセスしています。

class HomeController < ApplicationController
require "rubygems"
require "google_drive"

  def show
    client_id     = "クライアント ID"
    client_secret = "クライアント シークレット"
    refresh_token = "リフレッシュトークン"
    client = OAuth2::Client.new(
        client_id,
        client_secret,
        site: "https://accounts.google.com",
        token_url: "/o/oauth2/token",
        authorize_url: "/o/oauth2/auth")
    auth_token = OAuth2::AccessToken.from_hash(client, {
        :refresh_token => refresh_token, 
        :expires_at => 3600
    })
    auth_token = auth_token.refresh!
    session = GoogleDrive.login_with_oauth(auth_token.token)
    ws = session.spreadsheet_by_key("1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0").worksheets[0]

    # レコード数を取得
    p ws.num_rows
    # カラム数を取得
    p ws.num_cols
  end
end

"1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0" の部分は、アクセスしたいスプレッドシートのURL https://docs.google.com/spreadsheets/d/1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0/edit の "1dUS554DEogp9J2aWJmt2MEFvzNMlrogYtoGOQdV0" の部分を使用します。

アクセスすると見事「7」「3」と表示されました。

公式リポジトリ

google_drive

6. ページャーを実装したい(kaminari)

gem 'kaminari'

Railsのでページャーを実装したい時の定番Gemといえば「kaminari」。

page.png

コードを「数行」追加するだけで、上記のようなページャーが簡単に作成できます。

# app/controllers/home_controller.rb

class HomeController < ApplicationController
  def show
    @books = Book.page(params[:page])
  end
end
# app/views/home/show.html.erb

<% @books.each do |book| %>
<%= book.title %>
<% end %>
<%= paginate(@books) %>

paginateの部分にページャーができました。シンプル。

公式リポジトリ

kaminari

使い方

Railsでページャーを簡単に実装できるGem「kaminari」

7. 非同期処理を使いたい:ジョブキュー(sidekiq)

gem 'sidekiq'
gem 'sinatra', require: false  # ダッシュボードを利用するため

Railsで非同期処理を行いたい際に使うライブラリ「Sidekiq 」です。

side.png

Sidekiqは、resquedelayed_job などのような非同期処理を行いたい時に使うライブラリです。複数のジョブを同時に実行することができます。

Sidekiq には、Redisがバックグラウンド(ジョブ管理)に必要なのでインストールしておきます。管理画面のようなモニターを作成して、いまの状態を確認することもできます。

使い方はこちらにまとめております。Railsで非同期処理を行なえる「Sidekiq」

サーバー側とクライアント側の2種類の設定を追記します。

# config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

Sidekiq.configure_client do |config|
    config.redis = { url: 'redis://localhost:6379', namespace: 'test_sidekiq' }
end

デプロイ時には、sidekiqがロードしているコードが更新されないため、capistranoを使っている場合は設定を追記して、デプロイと同時に起動・再起動をできるようにしましょう。

require 'sidekiq/capistrano’ 
set :sidekiq_role, :web

状態がみれるモニター

# config/routes.rb

require 'sidekiq/web'
 mount Sidekiq::Web, at: "/sidekiq"

モニターを作成するためにmountします。http://localhost:3000/sidekiq にアクセスすると...

sidekiq_mount.png

こういった綺麗な画面がつくられます。

公式リポジトリ

sidekiq

sidekiqのwiki

sidekiqのwiki

使い方

Railsで非同期処理を行なえる「Sidekiq」

8. スクレイピングしたい(Mechanize)

gem 'mechanize'

試しに、KAYACの公式Webサイトから「タイトル」と「URL」を取得してみます。

スクリプト

# app/controllers/home_controller.rb

class HomeController < ApplicationController
require 'mechanize'

  def mechanize
    agent = Mechanize.new
    page = agent.get('http://www.kayac.com/')
    p page.title
    p page.at("a").attributes["href"].text
  end

end

実行結果

Processing by HomeController#mechanize as HTML
"面白法人カヤック"
"http://www.kayac.com/"

さくっと取得できました。さらにMechanizeを使えば、POSTをすることも可能です。

POSTの仕方はこちらに書きました。RubyのMechanizeで画像をPOSTする方法

# run.rb

require 'mechanize'

# 画像のpathを指定
IMAGE_PATH  = '/path/to/sample.png'
# POSTするURLを指定
REQUEST_URL = 'http://moss.moss/api/image/uploader'

agent = Mechanize.new

# 処理を10回繰り返す
10.times do |i|
  response = agent.post(REQUEST_URL, {
    text: 'mossmossmoss', # 一緒にPOSTしたいデータがある時
    image:  File.open(IMAGE_PATH),
  })

  # responseがある場合にprintされる
  print "#{i+1}: #{response.code} #{response.body}\n"

  sleep 3 
end

公式リポジトリ

mechanize

------------------ おまけ ------------------

9. ソーシャル上でシェアされた数を取得(social_counter)

# Gemfile
source 'https://rubygems.org'

gem 'social_counter'

social_counterは、あるWebサイトがTwitter、Facebook などのソーシャルメディア上で「どれくらいシェアされているか」を知りたい時に使えます。

スクリプト

require 'social_counter'

# 引数でもらう
url = ARGV[0]
@sc = SocialCounter.new(url)
p "タイトル:#{@sc.title}"
p "Twitter:#{@sc.twitter_count}"
p "Facebook:#{@sc.facebook_count}"
p "Hatena:#{@sc.hatena_count}"
p "Pocket:#{@sc.pocket_count}"
p "Google:#{@sc.google_count}"

実行結果

"タイトル:もすもす"
"Twitter:2300"
"Facebook:8338"
"Hatena:422"
"Pocket:501"
"Google:62"

調べられるSNS一覧

  • Twitter
  • Facebook
  • Hatena Bookmark
  • Google Plus
  • Pocket
  • Linkedin
  • Delicious
  • Pinterest
  • Reddit

公式リポジトリ

social_counter

使い方

ソーシャル上でシェアされている数が一発でわかるRubyGem「social_counter」

10. Amazonで商品を検索(amazon-ecs)

# Gemfile
source 'https://rubygems.org'

gem 'amazon-ecs'

サービスをつくっているときに、Amazonの商品を使いと時があるかと思います。そんなときにAmazon APIが使える便利Gem「amazon-ecs」。

使い方はこちらにまとめました。RailsでAmazon APIを使って商品を検索する方法

公式リポジトリ

amazon-ecs

最後に

Gemは本当に便利で「こういう機能がほしい」思った時に、RubyGems.org やWebで検索してみると、過去の偉人達がつくった Gem を見つけることができ、簡単に実装することができます。

どのGemが人気なのかがわかる「The Ruby Toolbox」なんてサービスも便利です。(The Ruby Toolboxは、Ruby開発者が利用している gem をカテゴリごとに分類して、ランキング形式で紹介しているサイト)

とても便利なGemですが、開発者が開発から離れてしまったために、保守されていないものも世の中にはたくさんあります。Gemを選ぶ時は、利用している人が多く、最終更新日がなるべく新しいものを選ぶようにしましょう。

明日は @satotakashi パイセンです!!