読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

rails newしたときの開発を効率化するためにまず行いたい6つの設定まとめ

Rails中級 まとめ

f:id:nipe880324:20150107013920j:plain:w620

よくRailsプロジェクトを作るので、Railsプロジェクトを作った後に最初にやっておきたい設定をまとめました。
主に、開発を効率化させるためにやることをまとめてますので、ざざっと眺めて取り入れそうな知識があったら開発効率を上げれるかもしれません。

また、nanapiさんの次の記事もとても参考になります。Rails Templateでプロジェクト作成を楽にしよう



動作確認

  • mac os X 10
  • rails 4.2.0

目次

6. 準備をしたその後


1. Railsプロジェクトの作成

rails new first_settings_test

# RSpecを使う場合は、-T で test ディレクトリを作成しないようにする
rails new first_settings_test -T

# 既にプロジェクトを作っている場合は、testディレクトリをがっつり削除
rm -rf first_settings_test/test


2. Gitにプロジェクトを登録

git init
git add .
git ci -m "initial commit"

3. 開発を効率化させるGemをがっつり導入

好きなgemだけ選んでインストールする方法でもよいと思います。


3.1. gemのインストール

Gemfileに記載し、gemをインストールします。

# Gemfile

# jqueryのイベントがturbolinkのせいで発火しなくなる問題を解消するgem
gem 'jquery-turbolinks'

group :development do
  # 開発を効率化する関連
  gem 'guard-livereload', require: false # ソースを修正するとブラウザが自動でロードされ、画面を作るときに便利
  gem 'rails-erd'                        # rake-erdコマンドでActiveRecordからER図を作成できる
  gem 'spring-commands-rspec'            # bin/rspecコマンドを使えるようにし、rspecの起動を早めれる
  gem 'bullet'                           # n+1問題を発見

  # 保守性を上げる
  gem 'rubocop', require: false          # コーディング規約の自動チェック
end

group :development, :test do
  # pry関連(デバッグなど便利)
  gem 'pry-rails'    # rails cの対話式コンソールがirbの代わりにリッチなpryになる
  gem 'pry-doc'      # pry中に show-source [method名] でソース内を読める
  gem 'pry-byebug'   # binding.pryをソースに記載すると、ブレイクポイントとなりデバッグが可能になる
  gem 'pry-stack_explorer' # pry中にスタックを上がったり下がったり行き来できる

  # 表示整形関連(ログなど見やすくなる)
  gem 'hirb'         # モデルの出力結果を表形式で表示する
  gem 'hirb-unicode' # hirbの日本語などマルチバイト文字の出力時の出力結果がすれる問題に対応
  gem 'rails-flog', require: 'flog' # HashとSQLのログを見やすく整形
  gem 'better_errors'     # 開発中のエラー画面をリッチにする
  gem 'binding_of_caller' # 開発中のエラー画面にさらに変数の値を表示する
  gem 'awesome_print'     # Rubyオブジェクトに色をつけて表示して見やすくなる
  gem 'quiet_assets'      # ログのassetsを表示しないようにし、ログを見やすくしてくれる

  # テスト関連
  gem "rspec-rails"        # rspec本体
  gem "shoulda-matchers"   # モデルのテストを簡易にかけるmatcherが使える
  gem "factory_girl_rails" # テストデータ作成
  gem "capybara"           # エンドツーエンドテスト
  gem "capybara-webkit"    # エンドツーエンドテスト(javascript含む)
  gem 'launchy'            # capybaraのsave_and_open_pageメソッドの実行時に画面を開いてくれる
  gem "database_cleaner"   # エンドツーエンドテスト時のDBをクリーンにする
  gem "test-queue"         # テストを並列で実行する
  gem 'faker'              # 本物っぽいテストデータの作成
  gem 'faker-japanese'     # 本物っぽいテストデータの作成(日本語対応)
end

gemをインストールします。

bundle install

capybara-webkitがインストールできないというエラーが出た場合は、コメントアウトするか次のコマンドをMacの場合は、実行してください

$ brew update
$ brew install qt4
# コンソールを開き直す
$ which qmake
/usr/local/bin/qmake  # 何か出力されればインストールされていること

3.2. jquery-turbolinksの設定

jquery-turbolinksを有効にします。

// app/assets/javascripts/applicaiton.js
...

//= require jquery
//= require jquery.turbolinks  // 追加
//= require jquery_ujs


3.3. 開発を効率化する関連gemの設定

guard-livereloadのGuardfileを作成する

bundle exec guard init livereload

# 次のコマンドでGuardをバックグラウンドで動かし、連携できます。
bundle exec guard

Guardの詳細な使い方は、 「guard-livereloadを使ってRailsでブラウザのオートリロードをさせる」を参照ください。



RSpecにSpringを追加します。

bin/spring stop
spring binstub --all

# これで次のコマンドを実行できるようになり、rspecの起動が速くなる
bin/rspec

Springについて詳細を知りたい場合は、「Springを使ってrailsのコマンド実行を早くする」を参照ください。



bulletを有効にします。

# config/environments/development.rb
Rails.application.configure do
  ...

  config.after_initialize do
    Bullet.enable  = true   # bullet を有効にする

    # 以下はN+1問題を発見した時のユーザーへの通知方法
    Bullet.alert   = true        # ブラウザのJavaScriptアラート
    Bullet.bullet_logger = true  # Rails.root/log/bullet.log
    Bullet.console = true        # ブラウザの console.log の出力先
    # Bullet.growl   = true      # Growl
    # Bullet.xmpp = { :account  => 'bullets_account@jabber.org',
    #                 :password => 'bullets_password_for_jabber',
    #                 :receiver => 'your_account@jabber.org',
    #                 :show_online_status => true }
    # Bullet.rails_logger = true # Railsのログ
    # Bullet.bugsnag      = true # 総合デバッガツールbugsnag
    # Bullet.airbrake     = true # Airbrake
    Bullet.raise        = true   # Exceptionを発生させる
    Bullet.add_footer   = true   # 画面の下部に表示(ajax時など非同期の場合は表示されない)
    # include paths with any of these substrings in the stack trace,
    # even if they are not in your main app
    # Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
  end
end

Bulletのより詳細な使い方は、「bulletでN+1問題を発見する」を参照してください。





3.4. 保守性を上げる

次のrubocopを実行するコマンドで、ソースコードがコーディング規約に準拠しているか確認できます。

bundle exec rubocop

デフォルトのコーディング規約については、「rubocopのコーディング規約 - GitHub」を参照してください。





3.5. 表示整形関連(ログなど見やすくなる)

HirbAwesome Printの設定ファイルを記載します。
Railsプロジェクトのルート配下に.pryrcを作成し、次の内容をコピーします。

# .pryrc

# For hirb
begin
  require 'hirb'
rescue LoadError
  # Missing goodies, bummer
end

if defined? Hirb
  # Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
  Hirb::View.instance_eval do
    def enable_output_method
      @output_method = true
      @old_print = Pry.config.print
      Pry.config.print = proc do |*args|
        Hirb::View.view_or_page_output(args[1]) || @old_print.call(*args)
      end
    end

    def disable_output_method
      Pry.config.print = @old_print
      @output_method = nil
    end
  end

  Hirb.enable
end

# For awesome_print
require "awesome_print"
AwesomePrint.pry!


3.6. テスト関連

RSpecの設定ファイルを作成します。

rails g rspec:install


そして、RSpecの設定ファイルを修正します。

# spec/rails_helper.rb

...

# Add additional requires below this line. Rails is not loaded until this point!
### 追加箇所 ###
require 'capybara/rails'
require 'capybara/rspec'
Capybara.javascript_driver = :webkit

...

### コメントアウトする ###
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

...

RSpec.configure do |config|
  ...

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  ### 修正箇所 true から falseにする ###
  # config.use_transactional_fixtures = true
  config.use_transactional_fixtures = false

  ### 追加箇所 開始 ###
  # suite: RSpecコマンドでテストを実行する単位
  # all:  各テストファイル(xxx_spec.rb)単位
  # each: 各テストケース(it)単位
  config.before(:suite) do
    DatabaseCleaner.clean_with :truncation  # テスト開始時にDBをクリーンにする
  end

  # js以外のテスト時は通常のtransactionでデータを削除する
  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  # jsのテスト時はtruncationで削除する
  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.after(:all) do
    DatabaseCleaner.clean_with :truncation # all時にDBをクリーンにする
  end
  ### 追加箇所 終了 ###
  ...
end

FactoryGirlのシンタックスを省略できるようにします。

# spec/support/factory_girl.rb
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end


test-queueで並列でテストを実行するための設定をします。
まず、bin/rspec-queueという名前の実行ファイルを作成します。

#!/usr/bin/env ruby

ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)

require "test_queue"
require "test_queue/runner/rspec"

#
# テストランナー
# Reference: https://github.com/tmm1/test-queue
#
class MyAppRSpecRunner < TestQueue::Runner::RSpec
  # def prepare(concurrency)
  # end

  def after_fork(num)
    # ワーカー別のデータベースを準備する。
    ENV.update("TEST_ENV_NUMBER" => num > 1 ? num.to_s : "")
    ActiveRecord::Base.configurations["test"]["database"] << ENV["TEST_ENV_NUMBER"]
    ActiveRecord::Tasks::DatabaseTasks.create_current
    ActiveRecord::Base.establish_connection(:test)

    Rails.application.load_tasks
    Rake::Task["db:reset"].invoke
  end

  # def around_filter(suite)
  #   $stats.timing("test.#{suite}.runtime") do
  #     yield
  #   end
  # end
end

MyAppRSpecRunner.new.execute


実行権限をつけます。

chmod 744 bin/rspec-queue


並列実行時のデータベース番号をつけます。
他にも並列テスト時に分ける必要があるものはENV['TEST_ENV_NUMBER']を追加します。

# config/database.yml

...

test:
  <<: *default
  database: db/test.sqlite3<%= ENV['TEST_ENV_NUMBER'] %>

次のコマンドで並列テストが実行できます。

bin/rspec-queue spec
  • (TODO) コードカバレッジ計測。ある程度以下になったら通知し、テストを作る。100%にすることよりも、一定水準(80%など)以上あることを確認することが大切。


4. 言語設定

application.rbで言語設定をを記載するとRailsのデフォルトの言語を設定できます。

# config/application.rb
...

module FirstSettingsTest
  class Application < Rails::Application
    ...

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
    ### 追加箇所 ###
    config.i18n.default_locale = :ja

    ...
  end
end


基本的な値を日本語化するには、config/locales配下にリンク先の「ja.yml」の内容をコピーして配置します。


また、自分で定義したActiveRecordのモデルの日本語化は次のような形式で記載し、config/locales配下に配置します。

# config/locales/ar_ja.yml
ja:
  activerecord:
    models:
      product: 商品

    attributes:
      product:
        name:        商品名
        description: 商品説明
        price:       値段
        released_at: 販売日

    # エイリアス
    products:
      *product



5. タイムゾーン

application.rbにタイムゾーンを記載するとRails全体のタイムゾーンを設定します。

# config/application.rb
...

module FirstSettingsTest
  class Application < Rails::Application
    ...

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'
    
    ### 追加箇所 ###
    config.time_zone = 'Tokyo'

    ...
  end
end

「ユーザー単位でタイムゾーンを設定したい」、「タイムゾーンの一覧を知りたい」場合などは、「Railsのタイムゾーンや時刻処理のまとめ」を参照してください。





6. 準備をしたその後

Railsで開発をしていくにあたりに一通りの設定ができました。この後は、自分が作りたいように作っていってください。
その前に、「認証機能」、「検索機能」、「デザイン」などよく必要になる機能へのリンクを貼っておきますので、必要なら参照して導入してみると良いかもしれません。

以上です。