Ruby on Railsでサービスを作ってみたpart1
Ruby on Railsでサービスを作ってみようと考えやってみた。いくつかのpartに分けて投稿して行こうと思う。まずは今回作ったサービスはアンケート作成と集計サービスだ。ソースはGithub/wata-gh/surveyに公開してある。画面イメージとしては以下。
画面イメージ
アンケート一覧
アンケート回答
アンケート編集
アンケート結果
技術要素(アプリ)
簡単にまとめると以下。
技術要素 | 名前 | 備考 |
---|---|---|
言語 | 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.js、app/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
開発開始
大体こんな感じの下準備を行い、後はガリガリ開発をしていく。次回は画面の作り等を書いていこうと思う。