OSX 10.10 で rails環境構築してみた


# 参考

* [Setup Ruby On Rails on Mac OS X 10.10 Yosemite - GoRails](https://gorails.com/setup/osx/10.10-yosemite)


# XCode command lineのインストール

```bash:
xcode-select --install
```


# rubyインストール

```bash:
brew install rbenv ruby-build
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile
```

```bash:7分くらいかかる
rbenv install 2.2.2
```

```bash:
rbenv global 2.2.2
ruby -v
```

# railsインストール

```bash:10分くらいかかる
gem install rails -v 4.2.3
```

```bash:
$ rbenv rehash
$ rails -v
Rails 4.2.3
```

# mariadb

```bash:
brew install mariadb
```

```bash:
brew info mariadb
```

```bash:
mysql.server start
```

# railsプロジェクト作成

```bash:初回はbundle&nbsp;installに数分かかる
rails new myapp -d mysql
```

```bash:
cd myapp
rake db:create
rails server
```

* http://localhost:3000/ にアクセスできることを確認。

# 作ってみる

* [開発現場でちゃんと使えるRails 4入門（1）：簡単インストールから始める初心者のためのRuby on Railsチュートリアル (2/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1402/28/news047_2.html#044)

## schaffold

```bash:
rails generate scaffold \
  book title:string \
  author:string \
  outline:text
```

```bash:
rake db:migrate
```

```bash:
rails server
```

* http://localhost:3000/books


### 作られたファイル一例

* app/views/books/index.html.erb
* app/controllers/books_controller.rb
* app/models/book.rb

## schaffoldを使わない場合

* [開発現場でちゃんと使えるRails 4入門（2）：scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1403/28/news035.html)

```bash:Userモデル作成
rails generate model \
  user name:string \
  department:string
```

```bash:
rake db:migrate
```

## consoleからレコード追加

```bash:
$ rails console
Loading development environment (Rails 4.2.3)
```

```rb:作成(未保存)
irb(main):001:0> user = User.new(name: "アリス", department: "ネットワーク管理部")
=> #<User id: nil, name: "アリス", department: "ネットワーク管理部", created_at: nil, updated_at: nil>
```

```rb:保存
irb(main):002:0> user.save
   (0.2ms)  BEGIN
  SQL (0.5ms)  INSERT INTO `users` (`name`, `department`, `created_at`, `updated_at`) VALUES ('アリス', 'ネットワーク管理部', '2015-06-26 00:16:59', '2015-06-26 00:16:59')
   (0.8ms)  COMMIT
=> true
```

```rb:作成と保存も同時に行う
irb(main):003:0> User.create(name: "ボブ", department: "サービス開発部")
   (0.2ms)  BEGIN
  SQL (0.6ms)  INSERT INTO `users` (`name`, `department`, `created_at`, `updated_at`) VALUES ('ボブ', 'サービス開発部', '2015-06-26 00:17:07', '2015-06-26 00:17:07')
   (0.7ms)  COMMIT
   => #<User id: 2, name: "ボブ", department: "サービス開発部", created_at: "2015-06-26 00:17:07", updated_at: "2015-06-26 00:17:07">
irb(main):004:0> user.save
   (0.3ms)  BEGIN
   (0.2ms)  COMMIT
=> true
```

![スクリーンショット 2015-06-26 9.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cd247060-2c96-2708-6c26-c75657f577ef.png "スクリーンショット 2015-06-26 9.51.17.png")


## ルーティング確認

* Route一覧を確認。users用routesがないことがわかる。

```bash:
$ rake routes
   Prefix Verb   URI Pattern               Controller#Action
    books GET    /books(.:format)          books#index
          POST   /books(.:format)          books#create
 new_book GET    /books/new(.:format)      books#new
edit_book GET    /books/:id/edit(.:format) books#edit
     book GET    /books/:id(.:format)      books#show
          PATCH  /books/:id(.:format)      books#update
          PUT    /books/:id(.:format)      books#update
          DELETE /books/:id(.:format)      books#destroy
```

もしくは以下にアクセス

* http://localhost:3000/rails/info/routes


### コントローラのコンポーネントを作成

```bash:
rails generate controller users
```

```diff:app/controllers/users_controller.rb
  class UsersController < ApplicationController
+   def index
+     @users = User.all
+   end
  end
```

```html:app/views/users/index.html.erb
<h1>利用者一覧</h1>
 
<table>
  <thead>
    <tr>
      <th>氏名</th>
      <th>部署</th>
    </tr>
  </thead>
 
  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.department %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

#### ルーティングの追加

```diff:config/routes.rb
  Rails.application.routes.draw do
    resources :books
+   resources :users, only: %i(index)
  end
```

```bash:usersのルーティングが追加されたことを確認
$ rake routes | grep users
    users GET    /users(.:format)          users#index
```

### 画面確認

* http://localhost:3000/users

![スクリーンショット 2015-06-26 9.54.10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/854811df-6930-498d-73fd-df3506db5dec.png "スクリーンショット 2015-06-26 9.54.10.png")

## 「new」「create」アクションを実装し、ブラウザーでデータを登録できるようにする

* [開発現場でちゃんと使えるRails 4入門（2）：scaffoldの中身を理解するためにMVCコンポーネントと7つのアクションを個別で自作する (3/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1403/28/news035_3.html)


```html:app/views/users/new.html.erb
<h1>新規利用者</h1>
 
<%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :department %><br>
    <%= f.text_field :department %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
 
<%= link_to 'Back', users_path %>
```

> 「form_for」メソッドは引数に取ったモデルオブジェクトのための\<form\>タグを生成します。
> * 未保存のデータであれば、createアクションに向けた宛先の情報を生成
> * 保存済みのデータであればその更新のためのアクションに向けた宛先の情報を生成

### controller

```diff:app/controllers/users_controller.rb
  class UsersController < ApplicationController
    def index
      @users = User.all
    end
  
+   def new
+     @user = User.new
+   end
+ 
+   def create
+     @user = User.new(user_params)
+     if @user.save
+       redirect_to users_url
+     else
+       render 'new'
+     end
+   end
+ 
+   private
+   def user_params
+     params.require(:user).permit(:name, :department)
+   end
  end
```

### ルーティング追加

```diff:config/routes.rb
  Rails.application.routes.draw do
    resources :books
-   resources :users, only: %i(index)
+   resources :users, only: %i(index new create)
  end
```

```bash:確認
$ rake routes | grep users
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
```

* http://localhost:3000/users/new から新規登録

![スクリーンショット 2015-06-26 10.09.04.png](https://qiita-image-store.s3.amazonaws.com/0/25728/78d97cdb-19de-d341-b9c8-0ef78fed7e64.png "スクリーンショット 2015-06-26 10.09.04.png")

![スクリーンショット 2015-06-26 10.08.48.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fbe45a7c-d43b-45de-2a34-431de76d0578.png "スクリーンショット 2015-06-26 10.08.48.png")

登録されたことを確認。