Wakotech Blog

ポエム

RailsでWebアプリを作るまでに使ったベストプラクティスっぽいgemのまとめ(2014)

先日、わこつAdvebtCalendar2014ことわこつ日記をリリースしました。
デザイン面で時間はかかったものの、コーディングの時間はほとんどかかっていません。が、開発する過程でベストプラクティスっぽいgemはどれだろうというのを調べ、今まで曖昧だった部分についてはっきりとさせました。
最低限これだけあれば最低限まともそうなwebアプリになるだろうというgemをリストアップして今年の学びの締めくくりとしたいと思います。

ユーザ管理関連

devise (ユーザ管理)

ユーザ登録の際のメアド管理やらパスワード管理やらまでしてくれます。パスワードも開発者が気にせずとも一方向性関数で安全に扱ってくれています。
後述のomniauthを使うことでのTwitterログインも継承クラスを少し書くだけで実装できるのでとても便利。
セッション管理も行ってくれ、簡単にログインユーザの情報を取り出せるメソッドも用意されています。
sessions_controllerは書かなくても処理されるので、SNSログインを使う場合は後述の通り、認証のコールバック内で処理を行うのがスマートそうです。
devise自体はとても大きく読み解くのも大変なので、あまり依存しすぎないようにはしたいです。

omniauth, omniauth-twitter (Twitterログイン)

TwitterOAuth認証を簡略化してくれるgemです。
DeviseのOmniauthCallbacksControllerを継承してコールバックの処理を書くことができるので、そこで認証のレスポンスからユーザ名やID、APIトークン等を簡単に取り出せます。
コールバック内にセッション操作やDB操作の処理を書くことでスッキリします。いろいろな書き方の記事がありますが恐らくこれが正解みたい……?

Devise+Omniauthについては以下の記事がとても良いと思います。

Rails - devise gemを使ってtwitter認証の設定 - Qiita

ビュー関連

simple_form (フォーム)

フォームをすっきりさせると共に、フォームでの入力エラーの表示もバリデーションから簡単に行えるようになります。

Railsのgemフォームコードをすっきりさせる simple_form - Rails Webook

kaminari (ページャ)

ページング表記をする際の処理が格段に簡単になります。
モデルの読み込み数を指定すればその個数ごとにページが区切られ(これだけでpageパラメータでアクセスできるようになり)、さらにページャリンクのヘルパーも自動で対応されます。

twitter-bootstrap-rails, less-rails, therubyracer (デザイン、css、less)

おなじみのBootstrapのgemです。私のようにデザインを専門にやっていないエンジニアの方は使っている方が多いと思います。
railsではassets pipelineという仕組みでjs、css開発を最適化している都合上、bootstrapにおいては不具合の原因となりやすくなっています。(何度となく直面している。)
このgemはrailsに最適化されているため、そのような問題をあまり意識することなく利用できます。また多様なヘルパーも用意されているため、erbテンプレートの場合煩雑になりがちなhtmlが非常にすっきりします。
部分的にbootswatchテーマを使用する場合はgemを入れるのではなく、/vendor/assets/stylesheets/bootswatc以下に配置し、bootstrap_and_overrides.css.lessにimport文を追記しましょう。

@import "bootswatch/variables.less";
@import "bootswatch/bootswatch.less";

ちなみにログインウィンドウをモーダルで実装した際に、bootstrapとbootswatchで競合してしまったため 、以下のサイトのような解決策が必要となります。

[rails][bootstrap]Rails4.1でBootswatchを試すと variable @zindex-modal-background is undefined エラーが発生 | hello-world.jp.net

bootswatchを使う場合はそのテンプレートベースで使用する前提でtwitter-bootswatch-railsを使うのが良さそうなのですが、パーツ利用にとどまる場合はこのようにするのがよさそうです。
参考

Ruby - twitter-bootstrap-railsでbootswatchを使う - Qiita

なお、lessを使用する場合はless-railsが必要になります。bootswatchがlessで配布されていることや、可読性、編集の容易さからlessを推奨します。(簡単な編集であればless初心者でもすぐに理解できます。)

上記のsimple_formと合わせてbootstrapの使用を紹介したこちらのページがとても良いです。

RailsにTwitter Bootstrapの導入と簡易な使い方 - Rails Webook

コントローラ関連

carrierwave, rmagick (画像アップロード)

画像アップロード処理に関するgemです。リサイズやiOSの傾きの修正、AWS等外部ストレージへの保存も簡単に行えます。

twitter (TwitterAPI操作)

TwitterAPIをラップしてくれています。gem名はそのまま「twitter」です。
Twitterログイン時に取得したAPIキーを使用して様々な処理をできます。実際使うのは投稿やフォロワー取得程度でしょうか。クライアントとしてアプリを作ったり、bot的な処理をさせる場合にも使用できます。
自身のAPIキーはTwitter Developpersから取得できるので、1アカウントから投稿、取得する場合は環境変数にキーを設定して動かせそうです。

設定関連

dotenv-rails

.envファイルに記述した変数を環境変数としてrails起動時に読み込んでくれます。
.envを.gitignoreで隠蔽し、読み込むときはENV['hoge']で良いので非常に楽です。(TwitterのCONSUMER_KEY等は公開するべきではないので、通常いずれかの手段で隠蔽します。)

デバッグ

pry

pry自体はirbコマンドを使いやすくしたものなのですが、コード中にbinding.pryと記述することで実行中にそこで一時停止し、pryを起動することができます。
pryが起動した時点での変数の確認や、メンバ変数、使用可能な関数を確認できるlsコマンド等便利なコマンドがあります。一時停止した地点から一行ずつ処理を進めるnextコマンドというものもあり、バグ解消に非常に便利です。
またrails cコマンドでコンソールを起動した際にもirbの代わりにpryが起動されるようになります。
pryはrailsでの開発に限らず、rubyでのスクリプト記述や他のフレームワークでも役に立つため特にオススメのgemです。

Better Errors

Railsのエラー画面をリッチにします。エラー発生時点での変数の状態を確認できるため、pryと合わせてバグ究明に役立ちます。

アプリケーションサーバ

unicorn

rials sコマンドで立ち上がるサーバ(Webrick)は簡易的なもので本番環境での利用は推奨されないため、一般的には別のものを用意します。
アプリケーションサーバunicornをnginxと組み合わせて使うのが高速で最近の流行だそうです。ここまでの中だとサーバ側の環境を整えるのが一番重そうですが、nginxの設定もそこまで難しくはないと思います。(apache+passengerよりは面倒でなかった。unicornの場合passengerと違い複数アプリを動かすことができる。)
サーバ側の設定はコード化しておくと楽です。この辺りはchef等でぐぐってください……。
他にもunicornの起動やnginxごとの再起動も自動化するスクリプトを書いておくと楽そうです。
……とは言ったものの、最近ではRaptorがいいというのも見るので、こちらも触ってみたいところです。

Ruby - 「RaptorはどのようにしてUnicornの4倍、Puma, Torqueboxの2倍の速度を達成したのか」を読んでまとめてみた - Qiita

これらのgemを有効活用すれば、最低限まともに見えるwebサービスが1人日程度で準備できてしまいます。Railsって怖いですね。
本当にRailsは怖いので、これらgemによる開発の効率化も良いのですが、仕組みを理解しないまま使うことを推奨するわけではありません。
参考

今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」

プログラミング初心者の落とし穴「Ruby on Rails勉強してます」「CakePHP勉強してます」 - カレーなる辛口Javaな転職日記

来年もRailsとうまい付き合い方をしていきたいものです。それではよいお年を。