ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (37〜46)/全46

#主な内容 - Blogシステムを作る（続き）

Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>* 新しい機能（Comment）を追加させましょう
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。

#仕様（再確認）
1. Post（記事を投稿、編集、削除できる機能）
1. <b>Comment（記事に対してコメントを投稿、削除できる機能）</b>

#作成の流れ
1. blogプロジェクトを作成
1. Modelを作成
1. DB
1. Controllerの作成
1. URLの作成（ルーティングの設定）
1. Controllerのメソッドの作成
1. メソッドに対応するViewを作成
1. <B>2〜7を機能分繰り返す</B>

#8. 機能分、2〜7を繰り返す
Post機能が完成しました。もう一つ機能を追加したくなったら2〜7をその機能に対して順にやっていくだけです。

##2. Commentモデルの作成
```bash:Terminal
$ rails g model Comment commenter:string body:text post:references
        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
        This poses a security threat. It is strongly recommended that you
        provide a secret to prevent exploits that may be possible from crafted
        cookies. This will not be supported in future versions of Rack, and
        future versions will even invalidate your existing user cookies.

        Called from: /Users/shiraihiroki/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/middleware/session/abstract_store.rb:28:in `initialize'.

      invoke  active_record
      create    db/migrate/20140317044238_create_comments.rb
      create    app/models/comment.rb
      invoke    test_unit
      create      test/unit/comment_test.rb
      create      test/fixtures/comments.yml
```
>セキュリティ警告が出ていますが、これは最新のRailsを使用していないことが原因なので無視します。
`post:references`は、CommentをPostオブジェクト一つ一つとと紐づけるといった意味合いになります。ひとつの投稿ごとにコメント機能を付けたいのでこのようにします。これを指定してrake db:migrateすると、commentsテーブルにpostと紐づけるためのフィールドが自動生成されます。

次に、PostモデルとCommentモデルのリレーションシップ（関係）について設定する必要があります。一つのPostに複数のCommentが属している、つまりここには[1対多のリレーションシップ](http://railsdoc.com/model#1%E5%AF%BE%E5%A4%9A%E3%81%AE%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97 "1対多のリレーションシップ")があります。このような場合、それぞれのモデルにその関係性を示してあげる必要があります。所有しているテーブル側のモデルには`has_many`を、所属している側のモデルには`belongs_to`を指定します。
Commentモデルにはモデル作成時にreferencesを指定してあげることで、`belongs_to :post`（ポストに属している）という関係設定が追加されています。
しかし、Postモデルには追加されません。してくれればいいのにとも思いますが笑（なにか理由があるのかな？）
ということで、Postモデルにも追加します。

```ruby:app/models/post.rb
class Post < ActiveRecord::Base
  attr_accessible :content, :title

  # titleは入力が必須（presence -> 存在していることが必須）
  validates :title, :presence => true

  # titleは入力が必須かつ、文字数の長さが最低５は必須
  validates :content, :presence => true,
                      :length => { :minimum => 5 }

  # PostオブジェクトはたくさんのCommentオブジェクトを持つ
  has_many :comments
end
```

##3. データベースに反映
```bash:Terminal
$ rake db:migrate
==  CreateComments: migrating =================================================
-- create_table(:comments)
   -> 0.0705s
-- add_index(:comments, :post_id)
   -> 0.0005s
==  CreateComments: migrated (0.0712s) ========================================
```
>commentsテーブルが作成され、オプションで指定したcommentsとpostとの紐付けがくわえられたことがわかります。紐付けはpost_idで行っていることになります。

##4. Commentsコントローラの作成
```bash:Terminal
$ rails g controller Comments
        SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
        This poses a security threat. It is strongly recommended that you
        provide a secret to prevent exploits that may be possible from crafted
        cookies. This will not be supported in future versions of Rack, and
        future versions will even invalidate your existing user cookies.

        Called from: /Users/shiraihiroki/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/actionpack-3.2.3/lib/action_dispatch/middleware/session/abstract_store.rb:28:in `initialize'.

      create  app/controllers/comments_controller.rb
      invoke  erb
      create    app/views/comments
      invoke  test_unit
      create    test/functional/comments_controller_test.rb
      invoke  helper
      create    app/helpers/comments_helper.rb
      invoke    test_unit
      create      test/unit/helpers/comments_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/comments.js.coffee
      invoke    scss
      create      app/assets/stylesheets/comments.css.scss
```

##5. URLの作成（ルーティング）
```ruby:config/routes.rb
Blog::Application.routes.draw do
  # Post機能のルーティング 
  resources :posts do
    # postレコードに関連づけられたComment機能のルーティング
    resources :comments
  end

  #ルート（/）にアクセスしたらpostsコントローラーのindexメソッド実行する
  root :to => 'posts#index'

  # The priority is based upon order of creation:
  # first created -> highest priority.

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

```
>commentsのルーティング設定をpostsのdo 〜 endで囲ってあげると、commentsがそれぞれpostsテーブルのpostレコードに関連づけられたURLを生成してくれます。

```bash:Terminal
$ rake routes
    post_comments GET    /posts/:post_id/comments(.:format)          comments#index
                  POST   /posts/:post_id/comments(.:format)          comments#create
 new_post_comment GET    /posts/:post_id/comments/new(.:format)      comments#new
edit_post_comment GET    /posts/:post_id/comments/:id/edit(.:format) comments#edit
     post_comment GET    /posts/:post_id/comments/:id(.:format)      comments#show
                  PUT    /posts/:post_id/comments/:id(.:format)      comments#update
                  DELETE /posts/:post_id/comments/:id(.:format)      comments#destroy
            posts GET    /posts(.:format)                            posts#index
                  POST   /posts(.:format)                            posts#create
         new_post GET    /posts/new(.:format)                        posts#new
        edit_post GET    /posts/:id/edit(.:format)                   posts#edit
             post GET    /posts/:id(.:format)                        posts#show
                  PUT    /posts/:id(.:format)                        posts#update
                  DELETE /posts/:id(.:format)                        posts#destroy
             root        /                                           posts#index
```
生成されたURLがpostに関連づけられているのが確認できました。

##6. 7. Controller内のMethod、それに対応するViewを作成
###show
コメントに関するView、Controllerを作っていきます。

####View
コメントはポスト表示ページ（show）につけたいので、show.html.erbにコメントを入力するフォームと、コメントを表示する部分を作っていきます。

```erb:app/views/posts/show.html.erb
<%# ヘッダー（記事のタイトル） %>
<h1><%= @post.title %></h1>

<%# 記事の内容 %>
<p><%= @post.content %></p>

<%# ヘッダー（コメント） %>
<h2>Comments</h2>
<%# 順序無しリスト %>
<ul>
  <%# コメントがあったら %>
  <% if @post.comments.any? %>
    <%# コメント数ループ %>
    <% @post.comments.each do |comment| %>
      <%# リストの内容 %>
      <li>
        <%# コメント本文 (by コメンター) %>
        <%= comment.body %> (by <%= comment.commenter %>)
      </li>
    <% end %>
  <%# コメントが無かったら %>
  <% else %>
    <%# no comment yet. %>
    <li>no comment yet.</li>
  <% end %>
</ul>

<h2>Add a comment</h2>

<%# @postに対するコメントフォーム %>
<%= form_for([@post, @comment]) do |f| %>

    <%# commenterに対するテキストフィールド %>
    <div class = "field">
        <%# commenterに対するテキストフィールド %>
        <%= f.label :commenter %>
        <%= f.text_field :commenter %>
    </div>

    <%# bodyに対するテキストエリア（５行分） %>
    <div class = "field">
        <%= f.label :body %>
        <%= f.text_area :body, :rows => 5 %>
    </div>

    <%# 送信ボタン（createメソッドへ） %>
    <div class = "actions">
        <%= f.submit %>
    </div>

<% end %>

<%# HOME（index）へ戻るリンク %>
<%= link_to 'home', posts_path %>
```
>1. `<% @post.comments.each do |comment| %>`
commentsはPostオブジェクトに関連づけられているので、このようにするだけでデータが取得できます。

>1. `<%= form_for([@post, @comment]) do |f| %>`
何かに関連づけられたものに対するフォームは`<%= form_for([所有されているオブジェクト, 所属しているオブジェクト) do |f| %>`のようにしてフォームを生成します。

####Controller

```ruby:app/controllers/posts_controller.rb
# coding: utf-8

class PostsController < ApplicationController

    # indexメソッド
    def index
        # Postから全てのデータを引っ張りだし、インスタンス変数postsに代入
        @posts = Post.all
    end

    # showメソッド
    def show
        # PostモデルのfindメソッドにparamsでURLから受け取ったIDを引数として与え、
        # そのデータが見つかったらインスタンス変数postに代入
        @post = Post.find(params[:id])
        # Postオブジェクトのidと紐付けられているcomments
        @comment = Post.find(params[:id]).comments.build
    end

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    
end
```
####動作確認
どれでも良いのでポストへアクセスします。
http://localhost:3000/posts/1
![スクリーンショット 2014-03-18 13.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/27500/02a3aaa8-137a-c68b-d599-390d19a1f3fa.png "スクリーンショット 2014-03-18 13.15.19.png")

レイアウトはかなり残念ですが、表示されました。
Comments欄はコメントがまだ入っていないので「no comment yet.」が表示されていることが確認できます。

###create
では、つぎにCreate Commentを押したときのコメント作成メソッドを作成していきます。コメントに関する処理なので、commentsコントローラに書いていきます。

```ruby:app/controllers/comments_controller.rb
class CommentsController < ApplicationController

  # createメソッド
  def create
    # idで指定したPostオブジェクトをデータベースから取得  
    @post = Post.find(params[:post_id])

    # フォームに入力されたデータをidで指定したPostオブジェクトに
    # 関連するコメントオブジェクトを作成し、データベースに登録
    # .create == (.new + .save)
    @comment = Post.find(params[:post_id]).comments.create(params[:comment])

    # 指定したポスト表示ページにリダイレクト
    redirect_to post_path(@post) 
  end
  
end
```
>.createはオブジェクトをインスタンス化（作成）する.newと作成したインスタンスオブジェクトをデータベースに登録する.saveを一度にやってくれる便利なメソッドです。

####動作確認
![スクリーンショット 2014-03-19 22.51.33.png](https://qiita-image-store.s3.amazonaws.com/0/27500/910e9252-6a8f-eea7-d0f9-23b021ceaf40.png "スクリーンショット 2014-03-19 22.51.33.png")

なにか入力して、Create Commentをクリックします。

![スクリーンショット 2014-03-19 22.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/27500/f54ac01b-e1ba-5499-fa48-81555135af27.png "スクリーンショット 2014-03-19 22.51.47.png")

きちんとコメントが登録、表示できていることが確認できました。

###バリデーションの設定、バリデーションエラーの表示
####バリデーションの設定
Postと同じルールにします。

```ruby:app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :post
  attr_accessible :body, :commenter

  # commenterは入力が必須（presence -> 存在していることが必須）
  validates :commenter, :presence => true

  # bodyは入力が必須かつ、文字数の長さが最低５は必須
  validates :body, :presence => true,
                      :length => { :minimum => 5 }
end
```

####commentのcreateメソッドを変更
バリデーションを追加したので、動作にも変更を加えます。コメントがデータベースに保存されたらコメントしたポストにリダイレクト、バリデーションエラーで保存できなかったらコメント入力に戻ります。

```ruby:app/controllers/comment_controller.rb
class CommentsController < ApplicationController

  # createメソッド
  def create
    # idで指定したPostオブジェクトをデータベースから取得  
    @post = Post.find(params[:post_id])

    # フォームに入力されたデータをidで指定したPostオブジェクトに関連するコメントオブジェクトを作成
    @comment = Post.find(params[:post_id]).comments.new(params[:comment])
    # もしデータベースへの保存が成功したら
    if @comment.save
      # 指定したポスト表示ページにリダイレクト
      redirect_to post_path(@post)
    # もしデータベースへの保存が成功しなかったら
    else
      # メソッド処理後にクライアントに返すhtmlのテンプレートをshowに指定
      render :template => "posts/show"
    end
  end
end
```
>`render :template => "posts/show"`は、createメソッド処理後にレンダリングするViewテンプレートを指定しています。標準でcomments/create.html.erbをレンダリングしようとするので、これがないとmissingエラーになります。今回はshow.html.erbをレンダリングしてほしいので、指定します。
>renderに関しては[このサイト](http://www.rubylife.jp/rails/controller/index3.html "このサイト")が大変参考になります。

####Viewも変更
バリデーションエラーを表示させたいので、show.html.erbにも変更を加えます。ポスト作成、編集フォームでのバリデーションエラー表示コードと同じですね。

```erb:app/views/posts/show.html.erb

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　前略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

<h2>Add a comment</h2>

<%# @postに対するコメントフォーム %>
<%= form_for([@post, @comment]) do |f| %>

    <%# もし@commentにエラーがあったら %>
    <% if @comment.errors.any? %>
        <%# 順序無しリスト %>
        <ul>
            <%# エラーの数だけループ %>
            <% @comment.errors.full_messages.each do |msg| %>
                <%# メッセージの内容を表示 %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    <% end %>

    <%# commenterに対するテキストフィールド %>
    <div class = "field">
        <%# commenterに対するテキストフィールド %>
        <%= f.label :commenter %>
        <%= f.text_field :commenter %>
    </div>
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
```

#####動作確認
コメントをわざと短くし、Create Commentしてみます。

![スクリーンショット 2014-03-21 10.33.23.png](https://qiita-image-store.s3.amazonaws.com/0/27500/94beafd6-dd4d-a3d0-bebc-e67c4bff4ce8.png "スクリーンショット 2014-03-21 10.33.23.png")

バリデーションエラーが表示されました。

* Commenterは空にはできない。
* bodyが短すぎる。（最小は５文字）

設定したバリデーションの通りエラーがでました。

つぎに、COmmenterに名前を、Bodyに５文字以上入力してからCreate Commentしてみます。

![スクリーンショット 2014-03-21 10.40.53.png](https://qiita-image-store.s3.amazonaws.com/0/27500/2fd714d2-5eaa-a87e-59e7-38bb8fa3ccd8.png "スクリーンショット 2014-03-21 10.40.53.png")
![スクリーンショット 2014-03-21 10.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/27500/b8fe8c7c-338f-3791-fa7f-4159359d6b2a.png "スクリーンショット 2014-03-21 10.41.01.png")

コメントがきちんと反映されました。

###destroy
ポストと同じようにコメントにも削除機能をつけます。

####View
まずは削除リンク、Ajaxのためにリスト項目へidを付加し、さらにjQueryで指定したidのコメントをフェードアウトさせる処理を書きます。
index.html.erbとほとんど同じです。

```erb:app/views/posts/show.html.erb
<%# ヘッダー（記事のタイトル） %>
<h1><%= @post.title %></h1>

<%# 記事の内容 %>
<p><%= @post.content %></p>

<h2>Comments</h2>
<%# 順序無しリスト %>
<ul>
	<%# コメントがあったら %>
	<% if @post.comments.any? %>
	    <%# コメント数ループ %>
	    <% @post.comments.each do |comment| %>
	    	<%# リストの内容 %>
	    	<li id = "comment_<%= comment.id %>">
	        	<%# コメント本文 (by コメンター) %>
	            <%= comment.body %> (by <%= comment.commenter %>)
	            <%# コメント削除リンク %>
	            <%= link_to "Delete", [comment.post, comment],
	                    # 確認メッセージ
	                    :confirm => "Sure?",
	                    # 実行するHTTPメソッド
	                    :method => :delete,
	                    # Ajaxを有効化（非同期処理）
	                    :remote => true %>
	  		</li>
		<% end %>
	<%# コメントが無かったら %>
  	<% else %>
  		<%# no comment yet. %>
  		<li>no comment yet.</li>
  	<% end %>
</ul>

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

<%# HOME（index）へ戻るリンク %>
<%= link_to 'home', posts_path %>

<script>
    $(function() {
        //deleteメソッドの処理が成功したらfunction内を実行
        $('a[data-method = "delete"]').on('ajax:success', function(event, data, status, xhr) {
            //comment_***のidを持った要素をゆっくりフェードアウト
            $('#comment_'+data.comment.id).fadeOut("slow");
        });
    });
</script>
```
>* `<%= link_to "Delete", [comment.post, comment]` commentはpostに属しているので、属しているpostオブジェクトのアドレスも保持しています。なのでcomment.postとすると、postを指定したことになります。


####Controller
destroyメソッドを実装します。postsコントローラのdestroyメソッドとほとんど同じですね。

```ruby:app/controllers/comment_controller.rb
class CommentsController < ApplicationController

  # createメソッド
  def create
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    　　　　　　　　　　　　　　中略
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
  end

  # destroyメソッド
  def destroy
    # idで指定したオブジェクトを取得
    @comment = Comment.find(params[:id])
    # オブジェクトの削除
    @comment.destroy
    # json形式で@commentの内容をcommentとしてViewに渡す
    render json: { comment: @comment}
  end

end

```

####動作確認
http://localhost:3000/posts/1

![スクリーンショット 2014-03-21 13.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/27500/2ed90284-2b93-b260-f6f9-5901b058b2b2.png "スクリーンショット 2014-03-21 13.10.00.png")　

Taroのコメントを削除してみます。Deleteリンクをクリックします。

![スクリーンショット 2014-03-21 13.10.11.png](https://qiita-image-store.s3.amazonaws.com/0/27500/5595f1cc-44d3-6cc3-bada-07ed21996c08.png "スクリーンショット 2014-03-21 13.10.11.png")

確認メッセージが確認できました。OKをクリックします。

![スクリーンショット 2014-03-21 13.10.40.png](https://qiita-image-store.s3.amazonaws.com/0/27500/67a47330-7b28-7d1e-a315-9101db6f3988.png "スクリーンショット 2014-03-21 13.10.40.png")

ぬるぬるっとTaroのコメントがフェードアウトし、削除されたことが確認できました。

###View
一覧（index）にポストごとにコメント数を表示させてみます。ポストタイトルのすぐ横が良いですね。postに属するコメント配列の大きさ（数）をsizeメソッドを使って取得しています。

```erb:app/views/posts/index.html.erb
<%# 一時通知メッセージ %>
<div id="notice"><%= notice %></div>
<%# ヘッダー %>
<h1>Posts</h1>
<%# 順序無しリスト %>
<ul>
    <%# ループ %>
    <% @posts.each do |post| %>
        <li id = "post_<%=post.id%>">
            <%# 記事のタイトルにリンクを張ってリスト表示 %> <%# postに属するコメント数を取得 %>
            <%= link_to post.title, post_path(post) %>(<%= post.comments.size %>)

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

```
####動作確認

http://localhost:3000

![スクリーンショット 2014-03-21 13.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/27500/8bddb1e3-3f4d-5cfa-e831-af7d784f8921.png "スクリーンショット 2014-03-21 13.37.43.png")

コメント数が表示されたのが確認できました。

##8. アプリケーションの日本語化
###日本語化パッチをダウンロード

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

![スクリーンショット 2014-03-21 13.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/27500/cd6638f3-cc5e-cc12-8cb0-bbdac880b155.png "スクリーンショット 2014-03-21 13.50.07.png")

Rawを右クリックしてリンク先を別名で保存

![スクリーンショット_2014-03-21_13.41.52.png](https://qiita-image-store.s3.amazonaws.com/0/27500/4232c038-8e3c-74a4-c940-181c459bb049.png "スクリーンショット_2014-03-21_13.41.52.png")

config/localesフォルダに保存

###設定
アプリケーション全体の設定ファイルに変更を加えます。
クラスの中であればどこでも良いので`config.i18n.default_locale = :ja`を追加します。

```ruby:config/application.rb

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

    # Configure the default encoding used in templates for Ruby 1.9.
    config.encoding = "utf-8"
    config.i18n.default_locale = :ja

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
　　　　　　　　　　　　　　中略
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
  end
end
```
>`i18n`はinternationalization（国際化）の略で、iとnの間に18文字あるのでこのような表記になっています。

###動作確認

http://localhost:3000/posts/1/comments

![スクリーンショット 2014-03-21 13.57.46.png](https://qiita-image-store.s3.amazonaws.com/0/27500/360e7355-74d5-7712-e87e-aae39cd76669.png "スクリーンショット 2014-03-21 13.57.46.png")

バリデーションエラーやフォームボタンが日本語化されていることが確認できました。


以上、これで終了です。
さすがはドットインストールさん、作っていてとても楽しいですね。それはrubyのおかげでもあるのかな？
とにかくお疲れ様でした。

#メモ一覧
1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (1〜2)/全46](http://qiita.com/hirokishirai/items/34d26a40f99425333f79 "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (1〜2)/全46")
>[#01	Ruby on Railsとは何か？](http://dotinstall.com/lessons/basic_rails/6501 "#01	Ruby on Railsとは何か？")
[#02	必要となるツールを揃えよう](http://dotinstall.com/lessons/basic_rails/6502 "#02	必要となるツールを揃えよう")
>
>* Ruby on Railsはこんなものですよ
>* 必要な情報はここら辺で集まりますよ
>* 必要な知識にはこんなものがありますよ
>* 開発環境はこんな感じですよ

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ 3/全46](http://qiita.com/hirokishirai/items/e0d3a7aa1de02ca2dbfc "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ 3/全46")
>[#03	MVCとは何か？](http://dotinstall.com/lessons/basic_rails/6503 "#03	MVCとは何か？")
>
>* Ruby on RailsはMVCフレームワークですよ
>* MVCはこんなものですよ

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (4〜8)/全46](http://qiita.com/hirokishirai/items/0038bbe5cd35ca92d60f "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (4〜8)/全46")
>[#04 はじめてのRailsプロジェクト](http://dotinstall.com/lessons/basic_rails/6504 "#04 はじめてのRailsプロジェクト")
[#05 ファイル構成をみていこう](http://dotinstall.com/lessons/basic_rails/6505 "#05 ファイル構成をみていこう")
アプリケーションを作成する基本的な流れを覚えましょう
>
>[#06 Webサーバーを立ち上げよう](http://dotinstall.com/lessons/basic_rails/6506 "#06 Webサーバーを立ち上げよう")
作成したWebアプリケーションをどうささせてみましょう
>
>[#07 scaffoldを使ってみよう (1)](http://dotinstall.com/lessons/basic_rails/6507 "#07 scaffoldを使ってみよう (1)")
[#08 scaffoldを使ってみよう (2)](http://dotinstall.com/lessons/basic_rails/6508 "#08 scaffoldを使ってみよう (2)")
DB、Model、View、Controllerの作成、URLの設定をしてみましょう

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (9〜13)/全46](http://qiita.com/hirokishirai/items/3c756d65fa837f765dc9 "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (9〜13)/全46")
>[#09 ブログシステムを作ろう](http://dotinstall.com/lessons/basic_rails/6509 "#09 ブログシステムを作ろう")
[#10	新しいプロジェクトを作ろう](http://dotinstall.com/lessons/basic_rails/6510 "#10	新しいプロジェクトを作ろう")
[#11	Postモデルを作ろう](http://dotinstall.com/lessons/basic_rails/6511 "#11	Postモデルを作ろう")
[#12	Postsコントローラーを作ろう](http://dotinstall.com/lessons/basic_rails/6512 "#12	Postsコントローラーを作ろう")
[#13	ルーティングの設定をしよう](http://dotinstall.com/lessons/basic_rails/6513 "#13	ルーティングの設定をしよう")
Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）
プロジェクト、Model、Controllerを作成し、ルーティングの設定をしよう

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (14〜21)/全46](http://qiita.com/hirokishirai/items/9c9b02311a95fb6a2e5d "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (14〜21)/全46")
>[#14	デバッグに使えるコンソールについて](http://dotinstall.com/lessons/basic_rails/6514 "#14	デバッグに使えるコンソールについて")
[#15	コントローラーのメソッドについて](http://dotinstall.com/lessons/basic_rails/6515 "#15	コントローラーのメソッドについて")
[#16	記事の一覧を表示する (1)](http://dotinstall.com/lessons/basic_rails/6516 "#16	記事の一覧を表示する (1)")
[#17	記事の一覧を表示する (2)](http://dotinstall.com/lessons/basic_rails/6517 "#17	記事の一覧を表示する (2)")
[#18	リンクを貼ってみよう](http://dotinstall.com/lessons/basic_rails/6518 "#18	リンクを貼ってみよう")
[#19	HTMLテンプレートを変更しよう](http://dotinstall.com/lessons/basic_rails/6519 "#19	HTMLテンプレートを変更しよう")
[#20	ロゴ画像を表示させてみよう](http://dotinstall.com/lessons/basic_rails/6520 "#20	ロゴ画像を表示させてみよう")
[#21	記事一覧画面をrootにしてみよう](http://dotinstall.com/lessons/basic_rails/6521 "#21	記事一覧画面をrootにしてみよう")
>
>Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
`rails console`とか、`rails dbconsole`なんかの便利なツールがありますよ
コントローラーのメソッドと、それに対応するViewを作っていきましょう
>
>Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。（まずは１つ）

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (22〜23)/全46](http://qiita.com/hirokishirai/items/ba9bea6679ca1a1f8629 "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (22〜23)/全46")
>[#22	記事の詳細を表示する (1)](http://dotinstall.com/lessons/basic_rails/6522 "#22	記事の詳細を表示する (1)")
[#23	記事の詳細を表示する (2)](http://dotinstall.com/lessons/basic_rails/6523 "#23	記事の詳細を表示する (2)")
>
>Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>
>* コントローラーのメソッドと、それに対応するViewを作っていきましょう（続き）
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。（続き - show）

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (24〜30)/全46](http://qiita.com/hirokishirai/items/979a1ca68716698ec103 "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (24〜30)/全46")
>
[#24 新しい記事を追加しよう (1)](http://dotinstall.com/lessons/basic_rails/6524 "#24 新しい記事を追加しよう (1)")
[#25	新しい記事を追加しよう (2)](http://dotinstall.com/lessons/basic_rails/6525 "#25	新しい記事を追加しよう (2)")
[#26	新しい記事を追加しよう (3)](http://dotinstall.com/lessons/basic_rails/6526 "#26	新しい記事を追加しよう (3)")
[#27	バリデーションを設定しよう](http://dotinstall.com/lessons/basic_rails/6527 "#27	バリデーションを設定しよう")
[#28	バリデーションエラーを表示しよう](http://dotinstall.com/lessons/basic_rails/6528 "#28	バリデーションエラーを表示しよう")
[#29	フラッシュメッセージを表示する](http://dotinstall.com/lessons/basic_rails/6529 "#29	フラッシュメッセージを表示する")
[#30	メッセージをjQueryで消す](http://dotinstall.com/lessons/basic_rails/6530 "#30	メッセージをjQueryで消す")
>
Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>
>* コントローラーのメソッドと、それに対応するViewを作っていきましょう（続き）
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。（続き - new,create）
>
>記事のタイトル一覧を表示するindexメソッド、その記事を表示するshowメソッドは完成したので次はその記事を表示するページが欲しいですね。ということでnewメソッド（新規作成フォーム）を作ります。また、フォームから送信されたデータを処理して新しい記事を作成するcreateメソッドも作成します。
>
バリデーション（検査）の設定をやってみよう（実践的）

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (31〜33)/全46](http://qiita.com/hirokishirai/items/3c0552e258b2f7d5defc "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (31〜33)/全46")
>
[#31	記事を更新してみよう (1)](http://dotinstall.com/lessons/basic_rails/6531 "#31	記事を更新してみよう (1)")
[#32	記事を更新してみよう (2)](http://dotinstall.com/lessons/basic_rails/6532 "#32	記事を更新してみよう (2)")
[#33	記事を更新してみよう (3)](http://dotinstall.com/lessons/basic_rails/6533 "#33	記事を更新してみよう (3)")
>Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>
>* コントローラーのメソッドと、それに対応するViewを作っていきましょう（続き）
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。（続き - edit, update）
>
>記事のタイトル一覧を表示するindexメソッド、その記事を表示するshowメソッド、記事の新規作成フォームを作成するnewメソッド、記事を作成するcreateメソッドは完成したので次はその記事を編集するページが欲しいですね。ということでeditメソッド（記事編集フォーム）を作ります。また、フォームから送信されたデータを処理して記事を上書きするupdateメソッドも作成します。
1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (34〜36)/全46](http://qiita.com/hirokishirai/items/cf4cc479b09d35501fc3 "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (34〜36)/全46")
>
[#34	記事を削除してみよう](http://dotinstall.com/lessons/basic_rails/6534 "#34	記事を削除してみよう")
[#35	削除処理をAjax化しよう (1)](http://dotinstall.com/lessons/basic_rails/6535 "#35	削除処理をAjax化しよう (1)")
[#36	削除処理をAjax化しよう (2)](http://dotinstall.com/lessons/basic_rails/6536 "#36	削除処理をAjax化しよう (2)")
>Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>
>* コントローラーのメソッドと、それに対応するViewを作っていきましょう（続き）
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。（続き - destroy）
>
>記事のタイトル一覧を表示するindex、その記事を表示するshow、記事の新規作成フォームを作成するnew、記事を作成するcreate、記事を編集するeditは完成したので次はその記事を削除するページが欲しいですね。ということでdestroyを作ります。

1. [ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (37〜46)/全46](http://qiita.com/hirokishirai/items/a25da39da0e6b32246ed "ドットインストールでRuby on Rails 3.2を学んだ際の詳細なメモ (37〜46)/全46")
>
[#37	Commentモデルを作ろう](http://dotinstall.com/lessons/basic_rails/6537 "#37	Commentモデルを作ろう")
[#38	Commentsコントローラーを作ろう](http://dotinstall.com/lessons/basic_rails/6538 "#38	Commentsコントローラーを作ろう")
[#39	コメントを表示させよう](http://dotinstall.com/lessons/basic_rails/6539 "#39	コメントを表示させよう")
[#40	コメントを投稿してみよう (1)](http://dotinstall.com/lessons/basic_rails/6540 "#40	コメントを投稿してみよう (1)")
[#41	コメントを投稿してみよう (2)](http://dotinstall.com/lessons/basic_rails/6541 "#41	コメントを投稿してみよう (2)")
[#42	バリデーションを設定しよう](http://dotinstall.com/lessons/basic_rails/6542 "#42	バリデーションを設定しよう")
[#43	コメントを削除してみよう (1)](http://dotinstall.com/lessons/basic_rails/6543 "#43	コメントを削除してみよう (1)")
[#44	コメントを削除してみよう (2)](http://dotinstall.com/lessons/basic_rails/6544 "#44	コメントを削除してみよう (2)")
[#45	コメント件数を表示してみよう](http://dotinstall.com/lessons/basic_rails/6545 "#45	コメント件数を表示してみよう")
[#46	Railsを日本語化しよう](http://dotinstall.com/lessons/basic_rails/6546 "#46	Railsを日本語化しよう")
>Scaffoldを使わずに、一からブログアプリケーションを作成しよう（実践的）（続き）
>
>* 新しい機能（Comment）を追加させましょう
>* Scaffoldでは自動生成してくれたModel、DBの設定、Controller、URL、Controllerのメソッド、Viewを自力で作ります。