wataメモ

日々のメモをつらつらと書くだけ

Ruby on Railsでサービスを作ってみたpart1

 Ruby on Railsでサービスを作ってみようと考えやってみた。いくつかのpartに分けて投稿して行こうと思う。まずは今回作ったサービスはアンケート作成と集計サービスだ。ソースはGithub/wata-gh/surveyに公開してある。画面イメージとしては以下。

画面イメージ

アンケート一覧

f:id:wata_htn:20150929174552p:plain

アンケート回答

f:id:wata_htn:20150929174557p:plain

アンケート編集

f:id:wata_htn:20150929174602p:plain

アンケート結果

f:id:wata_htn:20150929174607p:plain

技術要素(アプリ)

 簡単にまとめると以下。

技術要素 名前 備考
言語 Ruby バージョンは2.2.3
F/W Ruby on Rails バージョンは4.2.4
API Jbuilder
テンプレートエンジン slim+slim-rails 記述量が少ないの良い
altJS CoffeeScript+coffee-rails
JSテンプレートエンジン Handlebars+handlebars_assets Reactは選択せず
JSパッケージマネージャ bower+bower-rails
CSSフレームワーク Semantic UI Bootstrapより見た目が好きなため
グラフライブラリ Highcharts
DBマイグレーション Ridgepole 通常のmigrationが面倒なので
ページャ Kaminari+Kaminari Themes
Railsオブジェクト→JS gon Handlebarsとの連携のため
画像アップロード CarrierWave+fog S3にアップロード
テスト RSpec

開発環境

 開発環境および本番環境構築は「Infrastructure as Code」ということでプロビジョニングソースも同じくGithub/wata-gh/survey-provに公開してある。

技術要素 名前 備考
VM VirtualBox MacBookProには直接環境を作らずVMで開発パターン
VM環境構築ツール Vagrant
プロビジョニング Itamae Chefほど多機能は必要ない、簡単
コンテナ Docker+Docker Compose 開発環境での画像リサイズ、配信で利用

開発環境構築

 簡単に手順やらはまったことを書く。

Railsプロジェクト作成

 DBにはmysqlを利用し、bundleはvendor/bundle下に入れたいのでスキップさせる。

rails new survey -d mysql -T --skip-bundle
cd survey

 ただ、mysql2がRails4.2.4と相性が良くないのでmysql2を0.3.20にダウングレードするためにGemfileを編集。

Gemfile

# downgrade to 0.3.20. see https://github.com/brianmario/mysql2/issues/675
gem 'mysql2', '~> 0.3.20'

slimの設定

 Gemfileに追記。

Gemfile

gem 'slim-rails'

bowerの設定

 Gemfileに追記。

Gemfile

gem 'bower-rails'
# package.json作成
npm init
# bowerを追加
npm install bower --save-dev

# bower-rails初期化
./bin/rails g bower_rails:initialize

 Bowerfileにライブラリを追記。

Bowerfile

asset 'jquery'
asset 'moment'
asset 'handlebars'
asset 'highcharts'

 ライブラリの取得。

./bin/rake bower:install

Semantic UIの設定

 Gemfileに追記。

Gemfile

gem 'less-rails-semantic_ui'
gem 'autoprefixer-rails'
gem 'less-rails'
gem 'therubyracer' # to use less
# Semantic UI取得
./bin/rails generate semantic_ui:install

 Asset Pipeline経由で使うためにapp/assets/javascripts/application.jsapp/assets/stylesheets/application.cssに記述。

app/assets/javascripts/application.js

//= require semantic_ui/semantic_ui

app/assets/stylesheets/application.css

 *= require semantic_ui/semantic_ui

データベース作成

bundle exec rake db:create

Ridgepoleの設定

Gemfile

gem 'ridgepole'

 適当にdb/Schemafileに記述してapply。Schemafileはなんとなく直下ではなくdb配下に置いてみた。

# 開発DB反映
bundle exec ridgepole -c config/database.yml --apply -f db/Schemafile
# テストDB反映
bundle exec ridgepole -c config/database.yml --apply -f db/Schemafile --env test

RSpecの設定

 Gemfileの「group :development, :test」のところに追記

gem 'rspec-rails'

assetsのログ抑制

 assetsのログが出すぎて肝心なログが見えないので「quiet_assets」で抑制。

Gemfile

gem 'quiet_assets'

web_consoleのホワイトリスト追加

 VM上で開発するのでlocalhostからではなくなるので、ホストOSのIPを追加。

config/environments/development.rb

config.web_console.whitelisted_ips = '192.168.33.1'

Kaminariの設定

 言わずと知れたページャのKaminariをSemantic UIテイストで使う。

Gemfile

gem 'kaminari'

 Semantic UI版のslimテンプレートを使用。

./bin/rails g kaminari:views semantic_ui -e slim

CarrierWaveの設定

Gemfile

gem 'carrierwave'
# S3アップロード用
gem 'fog'

 Uploaderを作成。今回は仕様は何も変えていないが、返ることも想定してアンケートと質問それぞれのUploaderを作成。そしてなんとなく直接継承するのではなく、親クラスにまとめておいた。

# アンケート用
./bin/rails g uploader Survey
# 質問用
./bin/rails g uploader Question

unicornの設定

Gemfile

gem 'unicorn'

 config/unicorn.rbを作成。USR2シグナルで再起動が上手く行かなかったので、この部分で対応。
 ※参考URL

unicorn再起動用のrakeタスクをlib/tasks/unicorn.rakeに作成。

./bin/rails g task unicorn

 どの環境で動かすかはRAILS_ENVに依存するようにした。なので「.bashrc」から読み込む様にしている「.bashrc_local」に以下を追加。やはりTwelve-Factor Appの通り環境変数を上手く使うべきだと思う。

export RAILS_ENV=development

開発開始

 大体こんな感じの下準備を行い、後はガリガリ開発をしていく。次回は画面の作り等を書いていこうと思う。