76
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

小規模Rails開発でよく使うGem

Posted at

はじめに

最近小規模案件を回す事が増えたので、小規模案件でよく使うGemをここにまとめます。

kaminari

殆どの人が使っていると思われるほど有名なページネーション用のGemです。

gem 'kaminari'

ページングを使うときに使うGemはこれ一択。
以下、使用方法。

$ rails g kaminari:config

でConfigファイルを作成。

config/initializers/kaminari_config.rb
Kaminari.configure do |config|
  config.default_per_page = 10
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
end

作るだけ作ってデフォルトのまま使う事も多々ある。
上記の例では1ページに10件のデータを表示している。

# 使用可能テンプレートを調べる。
# 「avaliable themes: bootstrap2, bootstrap3, bourbon, foundation, github, google, materialize, purecss, semantic_ui」こちらが使用可能テンプレート
$ rails g kaminari:views -h

# 使うのはいつもbootstrap
$ rails g kaminari:views bootstrap3

使用するテンプレートを作る。
app/views/kaminari/に出来上がるのでデザインセンスのある方はここをカスタマイズしてください。
僕はまず、カスタマイズをしない。
(なぜなら、管理画面でしか使わないから。)

@user = User.page(params[:page]).all
# 表示件数を変えるときには以下のように行う。(モデル毎に設定する事も可能)
@user = User.page(params[:page]).per(40).all

コントローラー側でデータを取得するときには上記のように取得します。

<%= paginate(@users) %>
<% @users.each { |user| %>
	ここに表示処理を書く。
<% } %>

sucker_punch

小規模で遅延処理を行うときはこれが便利。
なぜならredisRDSに依存せずに別処理ができるから。
(無名だけど、小規模サイトでは重宝します。)

gem 'sucker_punch', '~> 1.0'

ActiveJobでも使用できるので、以下のように定義。

Rails.application.configure do
  config.active_job.queue_adapter = :sucker_punch
end

Jobは以下のようにapp/jobに登録。

app/job/task_job.rb
class TaskJob
  include SuckerPunch::Job

  def perform(event)
    Log.new(event).track
    # 1秒後に実行したい場合
    after(1) {Log.new(event).track}
  end
end

あとは呼び出すだけ。

# 非同期呼び出し
TaskJob.new.async.perform(event)
# 同期呼び出し
TaskJob.new.perform(event)

同一プロセスで動くので、引数はなんでも渡せるところが特徴。
ただし、同一プロセス内のスレッドで動くのでプロセスのCPUを消費してしまうデメリットもある。

使い方はこちら

P.S.
中規模以降はsidekiqなどを使ったほうが無難。

whenever

スケジューリングをしたい場合はこちら。
僕がわざわざ説明するほどではないくらい有名なGem。

gem 'whenever', :require => false

RakeRunnerシェルと組み合わせて使います。

$ wheneverize .

スケジュールファイルを作成して、スケジュールを書き込みます。

require File.expand_path(File.dirname(__FILE__) + "/environment")
rails_env = ENV['RAILS_ENV'] || :development

set :environment, rails_env
set :output, 'log/cron.log'

every 3.hours do
  runner "MyModel.some_process"
  rake "my:rake:task"
  command "/usr/bin/my_great_command"
end

言及しませんがenvironment毎にスケジュールを組む事も可能です。

# 設定の確認
$ bundle exec whenever 
$ bundle exec crontab -e
# cronにデータを反映
$ bundle exec whenever --update-crontab 
# cronからデータを削除
$ bundle exec whenever --clear-crontab

これでCronへの反映が可能です。

使うときは公式サイトをみてから使うと良いです。
Capistranoにも対応してるので管理がとても楽にできます。

P.S.
sidekiqを使ってる場合はsidetiqを使ったほうが構成がシンプルになると思う。
(使った事はないけど)

dotenv-rails

これはRails4では標準としても良いのではないだろうか?

gem 'dotenv-rails'

環境毎に定義したい値を以下のファイルに記載する。

RailsRoot/.env
# 本番パスワード
DATABASE_PASSWORD = "root"
# 本番用シークレット(rake secretと組み合わせて使う)
SECRET_KEY_BASE = "****"

このファイルを各サーバーに配置すれば、本番データベースの接続情報などを隠蔽できる。
Rails3まではconfig/database.ymlを個別にアップしていたが、Rails4からはこの方法が推奨されている。

config/secrets.yml
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
config/database.yml
production:
  <<: *default
  password: <%= ENV['DATABASE_PASSWORD'] %>

Rails4からはこのように定義されている。

Capistranoではこのようにアップすることができる。
linked_filesの設定も忘れずに!

aws-sdk

AWSのS3は切っても切れない関係。

gem 'aws-sdk'

僕の記事にアクセスクラスを作ったので、よければ使ってください。
→環境に合わせてS3を使うか、ローカルに保存するかを変更することができます。

unicorn

昔はPassengerをメインに使ってたけど、別プロセスで動作するUnicornのほうが管理が楽なので本番適用にはこちらを使ってます。

gem 'unicorn'

設定はこちらを読んでもらえれば分かると思います。

bcrypt

説明不要かと・・・
Railsを使っててこのGemを使ったことがない人はいないはず・・・

gem 'bcrypt', '~> 3.1.7'

rails_autolink

地味に便利・・・。

gem 'rails_autolink'

URLやメールなどに自動的にリンクを張りたいときに使います。

<%= auto_link @text %>

quiet_assets

どうでも良いけど、重要なGem(笑)

group :development, :test do
  gem 'quiet_assets'
end

ローカルで開発をしているとassetsへのgetがログに出てうるさいので消してくれる。

activerecord-import

小規模ではあまり使わないけど、まれに使うので記述。

gem 'activerecord-import'

大量のデータをDBへinsertするときに使えます。

User.import data_list, on_duplicate_key_update: [:email], validate: false

on_duplicate_key_updateを指定すれば、同一キーの場合はアップデートしてくれます。
validateをtrueにしたことはないけど、したら毎回valid?が呼ばれるのだろうか・・・?

P.S.
MySQLでしか使ったことがないので、ほかのRDSの場合は使う前に調査が必要。

rest-client

あんまり使わないけど、、、RESTサーバーに対してリクエストを送るときには重宝します。

gem "rest-client", ">= 1.7.3"

使い方は割愛。

rubyzip

地味に使います。zipファイルを圧縮したり、解凍したり。

gem 'rubyzip'

通常の使い方は割愛。

require "zip"
Zip::File.open_buffer(response.body) do |zf|
  zf.each do |entry|
    # ファイル名を取得する場合
    # p entry.name

    # ファイルの中身を返却します。
    filse << entry.get_input_stream.read # ファイルの中身
  end
end

HTTPリクエストの結果データがzipだった場合は上記のように取得できます。
このコードを知るまで僕は一度ファイルに保存してた・・・

まとめ

僕が使ってるGemなので偏りがありますが、新しいプロジェクトを作る際にお役に立てれば幸いです。

あとimagemagickも使いますが、僕はRubyにコマンドを叩かせてしまいますので上記からは除外しました。(CarrierWaveは未経験・・・。でも、同じことをimagemagickで頑張ったことはある。)

76
78
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
78

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?