アジャイル開発に取り組むチーム向けのコーチングや、技術顧問、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください(初回相談無料)
Rails4でスライド共有アプリを作りなおした話
RubyKaigiで寿司が出るなら行けば良かったと思ったみなさんこんにちは。
最近登壇した際に使ったスライドはSlideshareやSpeakerdeckではなく自作のスライド公開用Webサイト(https://slide.meguro.ryuzee.com/)で公開しています。 それについては以前の記事で書いた通りなのですが、最近時間がある(察してください…)ので、CakePHPで作った初期バージョンを勉強がてらRuby on Rails4で作りなおしてみました。
いままでRuby自体はChefのCookbookを書いたり、Serverspecのコードを書いたり、使い捨てプログラムを書いたりしていたのですが、初めてのRailsで「Railsを勉強しています!!」状態なのでやった内容を整理しておこうかと思います。
■初心者向けのメモ
自分が感じた初心者向けのポイントは以下のような感じです。
- アセットパイプラインの仕掛けは先に理解しておいた方が良さそう。初めてRailsを触って一番時間を費やしてしまった…
- とにかく設定より規約なので(という割にinitializerディレクトリの下がゴチャゴチャになりがちな気がするが)、始める前に、どんな種類のファイルをどこにおくのか整理しておく。例えば共通ライブラリ、外部からダウンロードしてきたJavaScriptなどなど
bundle exec rails g
コマンドでファイルを自動生成していくと多数のファイルが同時に作られる。一方で自分には必要のないファイルが作られることもあるので、ファイルの生成を始める前にまずgeneratorの設定をしておくと良い。あとから不要なファイルを消すのは面倒ください。詳細はこのあたりを参照:http://qiita.com/yuutetu/items/135b1c8ab512208aebfe- 前項に関係するが、一度レールに乗ってしまうと後戻りが結構面倒くさいので、最初の段階である程度、どんな技術要素を使うのか、どんなgemを使うのかを設計した方が良い。特にUI系のものは継ぎ足していくと後々謎なことが起こる
- gemはたくさんあるが、メンテナンスされていなかったり、不具合が多いものもあるので定番のものを見極める
- もともとCakePHPで作っていたアプリの移行で、既存の
schema_migrations
(CakePHP用)テーブルにtype
というカラム名が使われており、Railsのマイグレーションが失敗してしまった。複数の言語で1つのDBを扱ったりするとこの手の問題がおこることがあるので注意が必要 - ファイル数が全体的に多いので、VimでもEmacsでもなんでも構わないがキーボードでガンガン飛べるようにしておくことを強く推奨
■使っているgem
CakePHPだと使えるコンポーネントがCakeDCが作っているものくらいで、あとは頑張って作らないといけないとか、ライブラリを探す楽な方法が少ないとか切ない感じだったのですが、Rubyエコシステムすごい。とりあえずRubygemsを探せばだいたいほしいものはあるとか素晴らしい。 移植前後でコード量が1/3くらいまで減りました。使っているgemの主なものは以下のとおり。
mysql2
- DBにMySQLを利用する場合は必須
twitter-bootstrap-rails
- Bootstrap3を楽に導入できる。ただし最新バージョンを使うと後述のDeviseとConflictしていて一部Deviseの機能が動かなくなってしまったのでバージョンを固定している。細かい問題が色々おこる(例えばFont周り)ので敢えて使わなくても自前で管理すれば良い気がしなくもない
will_paginate / will_paginate-bootstrap
- ページング機能を簡単につくれる。同様のものにKaminari
dotenv-rails
- アプリケーションの設定情報をどのように管理するかはデプロイのしやすさに密接に関係がある。個人的には環境変数を使って外から値を設定できるようにするのがベストプラクティスだと考えている。このgemを使うと、アプリケーションのルートディレクトリに
env
ファイルがあれば、その中身を環境変数として設定して読み込んでくれる。env
ファイルがなければもともと設定されている環境変数を読んでくれる。開発環境ではenv
ファイルをおいておいて、本番では環境変数を直接読むように簡単にできる
devise / devise-bootstrap-views / devise-i18n / devise-i18n-views
- ユーザー登録・ログイン・パスワード再発行・認証などを良きに計らってやってくれる。認証に複雑な要件がなければとにかく楽
- 自前のカラムを追加するのもOKだが、trong Parameter関連の修正が必要。http://easyramble.com/add-field-devise-signup-form.html
php-serialization
- これは普通の人はあまり用はないが、PHPでシリアライズされたオブジェクトを読んだり、PHP形式にシリアライスしたりできる
acts_as_commentable
- コメント機能を簡単に追加できる
- 詳細は、http://morizyun.github.io/blog/acts-as-taggable-on-gem-rails/
- CakePHPのcakedc/tagsからの移行はSQLでゴリゴリやればOK
acts-as-taggable-on
- タグ機能を簡単に追加できる
ransack
- 複雑な検索をしたい場合(検索フォームを作りたい場合)に使う。大なり/小なり/指定した値を含む/指定した値から始まる、といった検索を簡単に実現できる
- 参考URL
- http://morizyun.github.io/blog/ransack-gem-rails-search/
- http://ruby-rails.hatenadiary.com/entry/20141008/1412774436 ここではテーブルヘッダーのソート機能についても言及されている
- Tagとの組み合わせ方 https://github.com/activerecord-hackery/ransack/issues/135
meta-tags
- タイトルをはじめとしたメタタグの管理
aws-sdk / aws-sdk-core / aws-sdk-resources
- 言わずと知れたAWSのSDK。最新はバージョン2系で、1系とは互換性がない。ネット上で検索すると記事が入り混じっているが、ソースの中で
AWS
(大文字のAWS)がある場合は1系、Aws
(先頭のみ大文字)の場合は2系なので、それで区別をつける
ruby-filemagic
- ファイルの種別を判別する。今回はアップロードされたファイルがPDFかパワーポイントであることを判別するのに利用
rmagick
- 画像をリサイズしたりクリップしたりといった各種加工ができる定番ライブラリ
pdf-reader
- PDFファイルのページ数などの属性を取得できる。ページ内のテキストも取得できるのだがあまり綺麗には取れないのでその部分は他のツールを使う
counter_culture
- カウンターキャッシュ(関連するモデルの件数をレコードに保存する)を使う際にトランザクションでガードしてくれる。大規模だったりすると使うと良いかも
rails-settings-cached
- アプリケーション内の設定情報などをDBに保存しつつキャッシュしてくれる。例えば個人設定なんかでこれを使うと良い
bootstrap3-datetimepicker-rails
- Bootstrap3の画面で利用するDateTimePickerを簡単に導入できる
non-stupid-digest-assets
- アセットパイプラインではファイル名の後ろに自動でハッシュが付与されるが、このgemを使うとハッシュなしのファイル名で生成できる
paperclip
- 画像アップロード機能を簡単につくれる。アップロード先はローカルストレージだけでなく、Amazon S3やDropboxなども利用できる。最近のバージョンでようやくAWS SDK2に対応した
rspec-rails
- どうもRailsではRSpecでテストするのが定番らしい(わりには最初からは入ってないのはなぜだ…)
factory_girl / factory_girl_rails
- フィクスチャーの代わりにテストデータを管理する。これも定番
- 基本的な使い方 http://qiita.com/muran001/items/436fd07eba1db18ed622
- サンプル http://ruby-rails.hatenadiary.com/entry/20150102/1420174315
- has_manyの関連元のレコードを作るときの注意事項 http://qiita.com/hisonl/items/6af97357f67dd050aeba
- FactoryGirlのデータとActiveRecordのデータを比較するときの注意(単にActiveRecordだとRelationが返ってくるので、to_aすれば良い) http://hamasyou.com/blog/2014/02/17/rails-request-rspec/
annotate
- 開発時に利用する。これを使うとモデルなどのコードに関連するテーブルのスキーマ情報を挿入できる。いちいちテーブル定義表見たり、
show columns from XXX
をしなくて良いので効率があがる
rubocop / guard-rubocop
- コーディング規約にしたがっているかをチェックしてくれる。設定ファイルは一杯落ちているので好みのものを拾ってくると良い
- 設定ファイルは、https://gist.github.com/onk/38bfbd78899d892e0e83 が分かりやすかった
guard
- こいつを起動しておくと登録されたジョブを自動でやってくれる。例えばRubocopをガンガン回せる
i18n_generators
- 国際化対応用のファイルを自動で生成してくれる
bullet
- N+1問題(レコード数が増えるのに連れて、投げるクエリの数が増えてしまう問題)を自動で検出してくれる。データが多くなる場合は必須
- 見つかったあとは、Eager Loadingを使って対処すれば良い
hirb / hirb-unicode
- Railsコンソールを見やすく整形したり色をつけたりしてくれる。Gemでインストールしたらコンソールで、Hirb.enableを実行するか、
.irbrc
を設定して常時有効化しておく
rails-erd
- ER図を生成してくれる。プロジェクトの途中から参加したときとかにいいかも
rack-dev-mark
- ブラウザでアクセスしたときに、いまの環境が
development
だったらページの左上にその印を付けてくれる。開発環境だとすぐ分かるので便利
view_source_map
- 画面が生成された際に、Partialを使って読み込んだ部分の前後に、どのパーツを読み込んでいるかのコメントを入れてくれる。デバッグに便利
better_errors
- エラー画面をゴージャスな感じにしてくれる。デフォルトではlocalhostしか有効にならないので、仮想マシンを使っている場合はIPを追加する
database_cleaner
- テスト実行の際にDBをクリーンアップしてくれる
capistrano / capistrano-rails / capistrano-rbenv / capistrano-bundler / capistrano3-unicorn
- デプロイを自動化する
- とにかくRailsプロジェクトをはじめたら最初からやるべき。というのもアセットパイプラインまわりの問題は開発環境ではわかりにくいため。なので開発環境をVagrantで用意しているのであれば、デプロイ用の擬似本番(staging)を定義しておくと良いかも
- unicornと連携する場合、
unicorn.pid
の場所に注意。unicorn.rb
とdeploy.rb
で同一のものを指している必要がある
なお、ソースは、https://github.com/ryuzee/open-slideshare-v2 においてあります。 ドッグフーディング重要ということで、自分の環境には適用しましたが、まだプロダクションレベルにはほど遠いのでそういうものと思って見るだけにしておいてください。