よくRailsプロジェクトを作るので、Railsプロジェクトを作った後に最初にやっておきたい設定をまとめました。
主に、開発を効率化させるためにやることをまとめてますので、ざざっと眺めて取り入れそうな知識があったら開発効率を上げれるかもしれません。
また、nanapiさんの次の記事もとても参考になります。Rails Templateでプロジェクト作成を楽にしよう
動作確認
- mac os X 10
- rails 4.2.0
目次
3. 開発を効率化させるGemをがっつり導入
3.1. gemのインストール
3.2. jquery-turbolinksの設定
3.3. 開発を効率化する関連gemの設定
3.4. 保守性を上げる
3.5. 表示整形関連(ログなど見やすくなる)
3.6. テスト関連
4. 言語設定
5. タイムゾーン
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. 表示整形関連(ログなど見やすくなる)
Hirb
とAwesome 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で開発をしていくにあたりに一通りの設定ができました。この後は、自分が作りたいように作っていってください。
その前に、「認証機能」、「検索機能」、「デザイン」などよく必要になる機能へのリンクを貼っておきますので、必要なら参照して導入してみると良いかもしれません。
- 認証機能 => ログイン認証Gemのdevise導入方法
- 検索機能 => Ransackで便利な検索機能を作成する
- デザイン => Twitter Bootstrapの導入方法
以上です。