Railsでタスク管理アプリを作成

# タスク管理アプリを作ってみよう

## 1. 前置き

### 1. 前提・事前作業

 * [こっちの投稿](http://qiita.com/fujimohige/items/11e615baa6acbb4053dc)の内容を事前に実施済み
 * 例によって[ドットインストール](http://dotinstall.com/lessons/basic_rails_v2/24901)の写経
 * [#05 タスク管理アプリを作ってみよう](http://dotinstall.com/lessons/basic_rails_v2/24905)から実施



## 2. railsアプリケーション作成
* railsコマンドでアプリケーションを作成（ホームディレクトリにて実行）
* オプションで `--skip-bundle`とすれば、ライブラリとかのインストールはスキップ可能

```
rails new taskApp
```

* アプリケーションのルートフォルダへ移動

```
cd taskApp
```

* Gemfileの編集

```
vi Gemfile
```

* therubyracerを有効化（下記コメントアウトを有効化）

```
# gem 'therubyracer',  platforms: :ruby
```

* 起動チェック

```
rails s
```

* OK




## 3. プロジェクトの作成

* プロジェクト･･･RailsやRuby的な用語と言うより、このアプリの管理単位（タスク）
* scaffoldではなく、手作業で作成
* 下記を作成する
 * model
 * controller
* `rails generate` コマンドにて作成（`generate` は `g` で代用可能)



## 4. modelの作成

* Projectの属性としてtitleを持たせる
* modelの名称は __先頭は大文字__ 、 __単数形__ とすること（CoC）

```
rails g model Project title:string
```

* マイグレーションファイルが生成されるので、`rake` で反映させる

```
rake db:migrate
```

* チェックしてみる
* 今使ってるDBへアクセス

```
rails db
```

* sqliteだった。

```sql:sqlite3
.schema
```

* projectsっていうテーブルが出来てた。
* id っていうカラムがPKになってた。
* title っていうカラムも当然あった。
* 今のところ当然データはなし

```sql:sqlite3
select count(*) from projects;
```

* 脱出

```sql:sqlite3
.exit
```

* もうひとつの管理機能
* 作成したmodelをインタラクティブに弄っている、らしい。

```
rails console
```

* 弄ってみる
* `save` 実行時にPKである `id` にも値が登録される（Insert文が走る）

```rb:ruby
p = Project.new(title:"project1") # 必要な情報のみ登録
p.save                            # セーブ
p                                 # 登録内容を確認
```

* `new` と `save' を一緒にやりたければ下記の通り

```rb:ruby
Project.create(title:"project2")
```

* `p` の代わりは以下の通り(select文を直接発行するっぽい)

```rb:ruby
Project.all
```



## 5. controllerの作成

* modelと似たような感じ
* modelに対するcontrollerを作成時は __先頭大文字__ 、 __複数形__ がルール
```
rails g controller Projects
```

* ↓な感じのメッセージが表示される

```
      create  app/controllers/projects_controller.rb
      invoke  erb
      create    app/views/projects
      invoke  test_unit
      create    test/controllers/projects_controller_test.rb
      invoke  helper
      create    app/helpers/projects_helper.rb
      invoke    test_unit
      create      test/helpers/projects_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/projects.js.coffee
      invoke    scss
      create      app/assets/stylesheets/projects.css.scss
```

* `/home/vagrant/taskApp/app/controllers` にある `application_controller.vb` を開いてみる。

```rb:ruby
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
end
```

* 同じく `/home/vagrant/taskApp/config` にある `routes.vb` を開いてみる。

```rb:ruby
Rails.application.routes.draw do

  
  # 追加！！
  resources :projects # Projectに関するルーティングを自動生成
  

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root 'welcome#index'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route with concerns:
  #   concern :toggleable do
  #     post 'toggle'
  #   end
  #   resources :posts, concerns: :toggleable
  #   resources :photos, concerns: :toggleable

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end
```

* 編集結果をサーバにアップしたら `rake` でルーティングを確認

```
rake routes
```

* こんなんが出る

```
(in /home/vagrant/taskApp)
      Prefix Verb   URI Pattern                  Controller#Action
    projects GET    /projects(.:format)          projects#index
             POST   /projects(.:format)          projects#create
 new_project GET    /projects/new(.:format)      projects#new
edit_project GET    /projects/:id/edit(.:format) projects#edit
     project GET    /projects/:id(.:format)      projects#show
             PATCH  /projects/:id(.:format)      projects#update
             PUT    /projects/:id(.:format)      projects#update
             DELETE /projects/:id(.:format)      projects#destroy
```

一旦ポスト
続きは次の投稿で書く