Railsの開発環境を整える②

※2016年10月に別のブログで書いた記事を、移行したものになります。

---

新人SEである私が考えたベスト・プラクティスを、Ruby on Railsで実践してみるシリーズの2回目になります。

[Railsの開発環境を整える① \- Qiita](http://qiita.com/mokuo/items/1e0bde7c7c7af3c98648)
で環境は整ったので、今回は開発を進めて行きたいと思います。

## RailsでBootstrapを使えるようにする。

Bootstrapは、デザイン知識がなくてもきれいなサイトを作れる、CSSフレームワークです。  
使い方は、[Bootstrap 3.0入門 (全18回) - プログラミングならドットインストール](http://dotinstall.com/lessons/basic_twitter_bootstrap_v4)や[Bootstrap · The world's most popular mobile-first and responsive front-end framework.](http://getbootstrap.com/)を御覧ください。

まず、以下をGemfileに記述します。
```
gem 'bootstrap-sass'
gem 'autoprefixer-rails'
gem sass-rails
```

"autoprefixer-rails"は、自動でベンダープレフィックスを追加してくれます。  
"gem sass-rails"は、すでに記述があれば不要です。
```
$ bin/bundle install
```

app/assets/stylesheets/ にある application.cssをapplication.css.scssに変更してから、以下の２行を追加。
```
@import "bootstrap-sprockets";
@import "bootstrap";
```

"bootstrap-sprockets"は、必ず先に書いてください。  
app/assets/javascripts/application.js に以下を追加。
```
//= require bootstrap-sprockets
```

これで、Bootstrapが使えるようになります。  
**参考文献**

* [Rails bootstrapの導入 sassのススメ - Qiita](http://qiita.com/shizuma/items/83cdadbe0a629f1f74d1)
* [全部はいらないよね？bootstrap-sassをカスタマイズして使う方法 - Qiita](http://qiita.com/masamitsu-konya/items/e3630046774ac1fbd346)

## タイムゾーンとロケールの設定

config/application.rbに、以下を追記
```
module MokumokuLibrary
  class Application < Rails::Application
    \# Settings in config/environments/* take precedence over those specified here.
    \# Application configuration should go into files in config/initializers
    \# -- all .rb files in that directory are automatically loaded.
    <span style="color: #ff0000;">config.time_zone = 'Tokyo'
    config.i18n.default_locale = :ja</span>
  end
end
```

## rspecコマンドを使えるようにする。
今回は、テストフレームワークにRSpecを使用します。
まず、rspecコマンドを、Spring経由で呼び出す準備をします。
Spring経由で呼び出すことで、実行時間を短くすることができます。
```
$ spring binstub rspec
WARN: Unresolved specs during Gem::Specification.reset:
      minitest (~> 5.1)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
\* bin/rspec: generated with spring
```
エラーが起きたら、以下のコマンドで解決
```
$ gem cleanup
```
RSpecを利用する前に、一度だけ、以下のコマンドを実行する必要がある。
```
rails g rspec:install
```

## テストフレームワークを、mini_testからRSpecに変更
```
module MokumokuLibrary
  class Application < Rails::Application
  　　\# Settings in config/environments/* take precedence over those specified here.
  　　\# Application configuration should go into files in config/initializers
  　　\# -- all .rb files in that directory are automatically loaded.
  　　config.time_zone = 'Tokyo'
  　　config.i18n.default_locale = :ja
  　　<span style="color: #ff0000;">config.generators do |g|
  　　　　g.test_framework :rspec
  　　end</span>
  end
end
```

## Factory Girlの設定
spec/rails_helper.rbの以下を追記する。(RSpecでFactory Girlを利用するためには必要)
```
config.include FactoryGirl::Syntax::Methods

config.before(:suite) do
  FactoryGirl.reload
end
```

## localhost:3000にアクセスできるようにする
このままサーバーを立ち上げて、http://localhost:3000/ にアクセスしても、「このサイトにアクセスできません」となってしまいます。

config/boot.rbの末尾に、以下を追加
```
require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge(Host: '0.0.0.0', Port: 3000)
    end
  end
end
```
これについては、以下を参照。
[仮想サーバ上の WEBrick にローカルマシンから接続できない？！ - Rails つまみぐい](http://rails.hatenadiary.jp/entry/2016/06/24/210114)
[Vagrant + rails + CentOS7の組み合わせでゲストOSのlocalhost:3000に接続できない場合 - Qiita](http://qiita.com/kota2_0/items/27530febaf24a3bf285f)

また、本来localhostというのは自分自身を指すので、仮想マシンにlocalhostで接続することはできません。
Vagrantfileに以下を追加します。
```
config.vm.network "forwarded_port", guest: 3000, host: 3000
```
ファイアフォールの3000portを開ける
```
$ sudo firewall-cmd --permanent --add-port=3000/tcp
success
$ sudo firewall-cmd --reload
success
$ firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3 enp0s8
  sources:
  services: dhcpv6-client http ssh
  ports: 3000/tcp 8080/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```
http://localhost:3000/ にアクセスすると、デフォルトの画面が表示されました。

![Ruby-on-Rails-1024x507.png](https://qiita-image-store.s3.amazonaws.com/0/102964/7dddde28-9dce-4976-fdf2-449dae455dd3.png)

**参考文献**

* [仮想サーバ上の WEBrick にローカルマシンから接続できない？！ - Rails つまみぐい](http://rails.hatenadiary.jp/entry/2016/06/24/210114)
* [Vagrant + rails + CentOS7の組み合わせでゲストOSのlocalhost:3000に接続できない場合 - Qiita](http://qiita.com/kota2_0/items/27530febaf24a3bf285f)

## GitHubでバージョン管理
以下のサイトを参考に、作成したRailsプロジェクトをGitHubで管理できる。

* [Githubの使い方 Rails編 ~railsプロジェクトをGithubのリポジトリにアップ~ - nigoblog](http://nigohiroki.hatenablog.com/entry/2012/12/30/215822)
* [Railsアプリをgit + githubで管理する | Fuzz blog](http://fuzz-jpn.com/blog/rails_git_github/)
```
$ git add .
$git commit -m "first commit"
$git remote add origin git@github.com:mokuo/gtd_console.git
git pull origin master
git push origin master
```
※以下を参考に、鍵を作成し、登録しておく。
[Jenkins✕GitHubで、RailsのCIの仕組みを整える① | イチとゼロ - mokuoの技術ブログ](http://mokuo.yokohama/jenkins-github-rails-ci-1/#GitHub)

## GitHubにIssueを作り、コミットを紐付ける
機能追加などは、機能単位でGitHubのIssueをつくる。
コミットにIssue番号を付けることで、Issueに対してどのようなコミットが行われたかを見ることができるようになる。

## エラー解決

### $ bin/rspec コマンド実行時

#### ActiveRecord::NoDatabaseError
データベースを作成する。
```
$ bin/rake db:create
```
マイグレーションファイルを作成しているなら、以下も実行
```
$ bin/rake db:migrate
```

#### NoMethodError
```
NoMethodError:
       undefined method `build' for #

<rspec::examplegroups::authenticator::authenticator:0x007f7937c39b98>
```
と出たら、
spec/rails_helper.rbの以下を追記する。(RSpecでFactory Girlを利用するためには必要)
```
config.include FactoryGirl::Syntax::Methods

config.before(:suite) do
  FactoryGirl.reload
end
```
<strong>参考文献</strong>
<a href="https://www.amazon.co.jp/gp/product/4844335928/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=4844335928&amp;linkCode=as2&amp;tag=mokuo-22">実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=mokuo-22&amp;l=as2&amp;o=9&amp;a=4844335928" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;">

<iframe src="https://rcm-fe.amazon-adsystem.com/e/cm?t=mokuo-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=4844335928&amp;ref=qf_sp_asin_til&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;m=amazon&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<h3>rspecの実行でweb_consoleエラー</h3>
```
$ rspec spec/models/account_spec.rb
/home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/railties-5.0.0.1/lib/rails/railtie/configuration.rb:95:in `method_missing': undefined method `web_console' for #<rails::application::configuration:0x007fc495a2fb50> (NoMethodError)
Did you mean?  console
        from /home/vagrant/synced_folder/mokumoku_library/config/application.rb:22:in `<class:application>'
        from /home/vagrant/synced_folder/mokumoku_library/config/application.rb:10:in `<module:mokumokulibrary>'
        from /home/vagrant/synced_folder/mokumoku_library/config/application.rb:9:in `<top (required)="">'
        from /home/vagrant/synced_folder/mokumoku_library/config/environment.rb:2:in `require_relative'
        from /home/vagrant/synced_folder/mokumoku_library/config/environment.rb:2:in `<top (required)="">'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/vagrant/synced_folder/mokumoku_library/spec/rails_helper.rb:3:in `<top (required)="">'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/vagrant/synced_folder/mokumoku_library/spec/models/account_spec.rb:1:in `<top (required)="">'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `load'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `block in load_spec_files'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `each'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1433:in `load_spec_files'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:100:in `setup'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:86:in `run'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:71:in `run'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/runner.rb:45:in `invoke'
        from /home/vagrant/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/rspec-core-3.5.4/exe/rspec:4:in `<top (required)="">'
        from /home/vagrant/.rbenv/versions/2.3.0/bin/rspec:22:in `load'
        from /home/vagrant/.rbenv/versions/2.3.0/bin/rspec:22:in `<main>'
```
config/applicationの以下の箇所をコメントアウト。
```
# config.web_console.whitelisted_ips = '10.0.2.2'
```
動いた。
```
$ rspec spec/models/account_spec.rb
.

Finished in 0.14284 seconds (files took 13.47 seconds to load)
1 example, 0 failures
```
GitHubを見返してみると、Rails newしたときにはまだなくて、自分で書いた記憶もない。何かのコマンドを実行した時か、Gemでライブラリ読み込んだ時に、書き込まれるのか？
web consoleとは、ブラウザがコンソールになる的なものらしい。

<h3>Git addで改行コードエラー</h3>
```
warning: LF will be replaced by CRLF in app/models/account.rb.
The file will have its original line endings in your working directory.
```
<a href="http://d.hatena.ne.jp/Kmizukix/20100106/1262711140" target="_blank">git add した時に出る改行コードのwarning対応 - 先がまっくろー</a>を参考に解決できる。