rails環境を用意する手順いろいろ

自分用メモです。
まっさらなrails環境が欲しいときにいつも調べているので。

# rbenv + bundlerでrails環境を用意する手順
自分的には1番ベーシックなやり方です。
rbenvとbundlerが入っていることが前提です。
また、ここではruby2.3.0、rails5.0.0の場合とします。

```
$ mkdir myapp
$ cd myapp
$ rbenv versions

2.3.0が入っていなければinstallする
$ rbenv install 2.3.0

$ rbenv local 2.3.0

2.3.0に*が付いていることを確認する
$ rbenv versions

$ bundle init
$ vim Gemfile
```

```Gemfile
# railsのところのコメントアウトを外し、railsのバージョンを指定しておく
gem 'rails', '~> 5.0.0'
```

```
$ bundle install --path vendor/bundle
$ bundle exec rails new .
GemfileはYで上書きする
```

参考 http://qiita.com/youcune/items/222777415f00d19cccb4

# dockerを使ってrails環境を用意する手順
## rails + postgresqlの場合
前提として[docker for mac](https://docs.docker.com/docker-for-mac/)を使ってdocker環境を構築しました。
docker初心者なので[こちら](https://docs.docker.com/compose/rails/)を参考にruby2.3.0、rails5.0.0、postgresqlの場合とします。

```
$ mkdir myapp
$ cd myapp
$ touch Dockerfile
$ vim Dockerfile
```

```Dockerfile
FROM ruby:2.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

```
$ touch Gemfile
$ vim Gemfile
```

```Gemfile
source 'https://rubygems.org'
gem 'rails', '5.0.0'
```

```
$ touch Gemfile.lock
$ touch docker-compose.yml
$ vim docker-compose.yml
```

```docker-compose.yml
version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3010:3000"
    depends_on:
      - db
```

3010:3000のところはmacのport3010番とコンテナ内の3000番をつなぐという意味になります（例えばmacのlocalhost:3000で何も起動していなければ3000番のままで問題ないので良いです）

```
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle

rails newすると生成されるファイルなどが生成されているか確認する
$ ls -l

$ vim Gemfile
```

```Gemfile
# 以下の行のコメントアウトを外す
gem 'therubyracer', platforms: :ruby
```

```
$ docker-compose build
$ vim config/database.yml
```

```config/database.yml
development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test
```

```
$ docker-compose up
```

別のターミナルで

```
$ docker-compose run web rake db:create
```

そして http://localhost:3010/ にアクセスすると以下のページが表示されます。

![スクリーンショット 2016-11-24 0.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/2609/4e572024-d524-00f9-d9e1-cfafdbbd5c9f.png "スクリーンショット 2016-11-24 0.25.26.png")

### 編集してみる
トップページをオリジナルのページに変更してみます。
以下のコマンドでwelcome controllerとindex actionを作ります。

```
$ docker-compose run web rails generate controller welcome index
```

routingを変更します。

```
$ vim config/routes.rb
```

```config/routes.rb
# get 'welcome/index'
root 'welcome#index'
```

そして http://localhost:3010/ にアクセスすると、コンテナ側にもすぐ反映されます。

![スクリーンショット 2016-11-24 0.44.28.png](https://qiita-image-store.s3.amazonaws.com/0/2609/c2ea6d19-f03c-db1c-ee2a-e1e74a4f8e15.png "スクリーンショット 2016-11-24 0.44.28.png")

## rails + mysqlの場合
[こちら](http://easyramble.com/rails-development-on-docker.html)を参考にしました。
上記手順の```$ vim docker-compose.yml```までは同じです。

```docker-compose.yml
version: '2'
services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: hogehoge
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3011:3000"
    depends_on:
      - db
```

**注意**

```
environment:
  MYSQL_ROOT_PASSWORD: hogehoge
```

この部分がないと起動したときに以下のようなエラーになります（[参考](http://stackoverflow.com/questions/39678463/docker-compose-database-is-uninitialized)）。

```
db_1   | error: database is uninitialized and password option is not specified
db_1   |   You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
```

手順に戻って、以下を実行します。

```
$ docker-compose run web rails new . --force --database=mysql --skip-bundle

rails newすると生成されるファイルなどが生成されているか確認する
$ ls -l

$ vim Gemfile
```

```Gemfile
# 以下の行のコメントアウトを外す
gem 'therubyracer', platforms: :ruby
```

```
$ docker-compose build
$ vim config/database.yml
```


```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: hogehoge
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

```
$ docker-compose up
```

別のターミナルで

```
$ docker-compose run web rake db:create
```

そして http://localhost:3011/ にアクセスすると以下のページが表示されます。

**注意**

```$ docker-compose up```で以下のようなエラーになる場合は、[ここ](https://docs.docker.com/compose/rails/)に書いてある通りに```tmp/pids/server.pid```を削除して```$ docker-compose up```すると起動できます。

```
web_1  | => Booting Puma
web_1  | => Rails 5.0.0 application starting in development on http://0.0.0.0:3000
web_1  | => Run `rails server -h` for more startup options
web_1  | A server is already running. Check /myapp/tmp/pids/server.pid.
web_1  | Exiting
myappm_web_1 exited with code 1
```