この記事は 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をインストールすることができます。
それではさっそく機能ごとに紹介していきます。
1. 画像をアップロードしたい(CarrierWave)
# Gemfile source 'https://rubygems.org' gem 'carrierwave' gem 'fog' gem 'rmagick'
CarrierWaveは、画像アップロードする際に利用する便利なgemです。
RMagick を使うことができるので、画像処理でリサイズなどちょっと凝ったことをすることもできます。さらにfogというGemを利用すれば、Amazonが提供するS3に、簡単にアップロードすることも可能です。
使い方はこちらにまとめました。 Railsで画像をリサイズしてS3にアップロードする方法
公式リポジトリ
使い方
2. 管理画面を作成したい(ActiveAdmin)
gem 'activeadmin', github: 'gregbell/active_admin’
続いてご紹介するのは、Railsプロジェクトで管理画面を簡単に作成できるGemパッケージ「Active Admin」です。
非エンジニアでも簡単にデータにアクセスできりようにするために、管理画面は何かと必要になることが多いと思います。カスタマイズがしやすくデザインも整っているので、今回はRailsAdminではなくActive Adminを選びました(githubのstarの数も少しactiveadminの方が多かったり)。
画面イメージ
ライブラリを追加するだけで、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で定数を環境ごとに管理する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に値が反映されます。
公式リポジトリ
使い方
5. スプレッドシートにアクセス(google_drive)
gem 'google_drive'
Googleのスプレッドシートは、Excel代わりに使えたりと何かと便利です。
スプレッドシートを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」と表示されました。
公式リポジトリ
6. ページャーを実装したい(kaminari)
gem 'kaminari'
Railsのでページャーを実装したい時の定番Gemといえば「kaminari」。
コードを「数行」追加するだけで、上記のようなページャーが簡単に作成できます。
# 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の部分にページャーができました。シンプル。
公式リポジトリ
使い方
Railsでページャーを簡単に実装できるGem「kaminari」
7. 非同期処理を使いたい:ジョブキュー(sidekiq)
gem 'sidekiq' gem 'sinatra', require: false # ダッシュボードを利用するため
Railsで非同期処理を行いたい際に使うライブラリ「Sidekiq 」です。
Sidekiqは、resque や delayed_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のwiki
使い方
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
公式リポジトリ
------------------ おまけ ------------------
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一覧
- Hatena Bookmark
- Google Plus
- Delicious
公式リポジトリ
使い方
ソーシャル上でシェアされている数が一発でわかるRubyGem「social_counter」
10. Amazonで商品を検索(amazon-ecs)
# Gemfile source 'https://rubygems.org' gem 'amazon-ecs'
サービスをつくっているときに、Amazonの商品を使いと時があるかと思います。そんなときにAmazon APIが使える便利Gem「amazon-ecs」。
使い方はこちらにまとめました。RailsでAmazon APIを使って商品を検索する方法
公式リポジトリ
最後に
Gemは本当に便利で「こういう機能がほしい」思った時に、RubyGems.org やWebで検索してみると、過去の偉人達がつくった Gem を見つけることができ、簡単に実装することができます。
どのGemが人気なのかがわかる「The Ruby Toolbox」なんてサービスも便利です。(The Ruby Toolboxは、Ruby開発者が利用している gem をカテゴリごとに分類して、ランキング形式で紹介しているサイト)
とても便利なGemですが、開発者が開発から離れてしまったために、保守されていないものも世の中にはたくさんあります。Gemを選ぶ時は、利用している人が多く、最終更新日がなるべく新しいものを選ぶようにしましょう。
明日は @satotakashi パイセンです!!