【初めてのRails4】 CRUDをまとめて作る rails g scaffold


[Ruby on Rails](http://rubyonrails.org/)を触ることになったので、[Ruby on Rails チュートリアル](http://railstutorial.jp/)を参考にしながら作成記録のメモ

## 環境

* CentOS6.4
* Rails 4.0.4

## 事前準備に必要なもの

* Ruby 2.x
 * インストールされていない場合は[【Rails4】 インストール編
](http://qiita.com/ryurock/items/77542e00cbca5268e323)を参考してください。
 * プロジェクトの作成をしていない場合は[【Rails4】 プロジェクトの作成 rails new](http://qiita.com/ryurock/items/79bc39a7bb473f140546)を参考にしてください。
 * 前の記事は[【Rails4】 gemライブラリを吟味する](http://qiita.com/ryurock/items/fd73a8d13bf043f93d4a)です。

* MYSQL
 * インストールされていない場合は[virtualbox(centos)でMYSQLインストールメモ(mysqld_multiで複数インスタンス起動まで)](http://qiita.com/ryurock/items/73df4ab45c96092b63b8)を参考してください。

## 参考にしたサイト

* [Ruby on Rails チュートリアル](http://railstutorial.jp/)
* [Rails Girls ガイド](http://railsgirls.jp/)
* [[2013年版][Rails3.2][Rails4.0]管理画面とフロント画面のroutesの綺麗な分離方法](http://namakesugi.blog42.fc2.com/blog-entry-162.html)

* [Railsドキュメント#アプリケーションに必要なコントローラ、モデル、ビューをまとめて生成(rails generate scaffold](http://railsdoc.com/rails#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E7%94%9F%E6%88%90)



## とりあえずユーザー一覧は必要でしょ

こんな事やったら途中で設計ミスで死ぬパターンになるんですかね？？？

とりあえず練習として

* name (ユーザー名)
* email (メールアドレス)

の２つでもあればいいか。。。。

## まあいいかとりあえず作ってみよう

と適当にやっていきます。

## アプリケーションに必要なコントローラ、モデル、ビューをまとめて生成(rails generate scaffold)

[Railsドキュメント#アプリケーションに必要なコントローラ、モデル、ビューをまとめて生成(rails generate scaffold)](http://railsdoc.com/rails#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E7%94%9F%E6%88%90)を読んでとりあえず作成してみます。

### 【注意】命名規則について

[Ruby on Rails チュートリアル#第2章デモアプリケーション#2.4最後に](http://railstutorial.jp/chapters/a-demo-app?version=4.0#sec-2_4)の注意事項に書かれていますが

>scaffoldにおける命名は、モデル名の命名の習慣に従っています。リソースやコントローラは複数形で表し、モデルは単数形で表すのが普通です。UsersではなくUserとしたのはこのためです。

と書かれていますので単数形、複数形の取り扱いには気をつけましょう。scaffoldコマンドCamelケースの単数形で実行すると自動的にモデルは単数形、コントローラー、Viewは複数形にしてくれます。

### 上記を踏まえた上でまずはドライランオプションで作られるMVCを確認

-p がドライランモードです


```shell:/path/to/hoge/{プロジェクト名}
rails g scaffold User name:string email:string -p

      invoke  active_record
      create    db/migrate/20140402113547_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    rspec
      create      spec/controllers/users_controller_spec.rb
      create      spec/views/users/edit.html.erb_spec.rb
      create      spec/views/users/index.html.erb_spec.rb
      create      spec/views/users/new.html.erb_spec.rb
      create      spec/views/users/show.html.erb_spec.rb
      create      spec/routing/users_routing_spec.rb
      invoke      rspec
      create        spec/requests/users_spec.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      rspec
      create        spec/helpers/users_helper_spec.rb
      invoke    jbuilder
      create      app/views/users
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.js.coffee
      invoke    scss
      create      app/assets/stylesheets/users.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss
```

問題がなければ、ドライランオプションを外して作りましょう

```shell:/path/to/hoge/{プロジェクト名}
rails g scaffold User name:string email:string
```

## プロジェクト用のDBを作成する

```
rake db:create
```
## migrateを実行する

マイグレーション分からない方は[Railsドキュメント#マイグレーションとは](http://railsdoc.com/migration)を一読してください

```shell:/path/to/hoge
rake db:migrate

== 20140402113618 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0082s
== 20140402113618 CreateUsers: migrated (0.0083s) =============================
```

### 作成されたテーブルの確認

確認しましょう


```shell:/path/to/hoge
mysql -u{ユーザー名} -p -e "use rpanda_development; show tables;"
+------------------------------+
| Tables_in_rpanda_development |
+------------------------------+
| schema_migrations            |
| users                        |
+------------------------------+
```

usersというテーブルができています

## railsサーバーを起動する

railsに搭載されているサーバーを起動しましょう。簡単です。

```shell:/path/to/hoge/{プロジェクト名}
#sはserverの略
rails s

=> Booting WEBrick
=> Rails 4.0.4 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2014-04-02 20:40:06] INFO  WEBrick 1.3.1
[2014-04-02 20:40:06] INFO  ruby 2.0.0 (2013-11-22) [x86_64-linux]
[2014-04-02 20:40:06] INFO  WEBrick::HTTPServer#start: pid=22345 port=3000
```

portが3000番で起動していますね。

### portが開いているか確認する

自分は[Vagrant](http://www.vagrantup.com/)で作成したvirtualboxで作成をしています。でよく忘れがちなのがportを開いておらず、ホストOS側から見れない現象です。

自分のメモ用に残しておきます

```shell:/etc/sysconfig/iptables
 Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#これ追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
```

### iptablesの再起動

```shell:/path/to/hoge
sudo /etc/init.d/iptables restart
```

### ブラウザで見れるか確認

自分のゲストOS側のIPアドレスは192.168.56.103なので確認します

http://192.168.56.103:3000/users

Listing usersと表示されていたらOKです。