2012年3月12日月曜日

WEB+DB(vol58)の RAILS3実践チュートリアル やってみる


Rails3.2で、 「WEB+DB(vol58)の RAILS3実践チュートリアル」を やってみた。
前出の作業リストに残りのチュートリアルを書き加えていく。

■ブログ投稿機能実装
  ①rails new aplname -d mysql --skip-bundle
  ②cd aplname
  ③vi Gamfile  -> gem therubyracer  を追加。
  ④bundle install

  ⑤JQuery本体のありか
     ここから、jQueryの最新バージョンのCDNをチェック
       ->http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.j  だった..
  ⑥設定
     vi app/assets/javascripts/application.js
        ->削除) //= require jquery
     vi app/views/layouts/application.html.erb
           (追加) <%= javascript_include_tag                          
                                 ' http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js  %>
   
  ⑤vi config/database.yml
        -> 11 development:
            12   adapter: mysql2
            13   encoding: utf8
            14   reconnect: false
            15   database: aplname_development
            16   pool: 5
            17   username: dbuser           # DBMで生成
            18   password: dbpass           # DBMで生成
            19   socket: /var/lib/mysql/mysql.sock
  ⑥rake db:create
  ⑦rails g scaffold post title:string body:text         #ブログ投稿機能生成
  ⑧rake db:migrate
  ⑨rake                                                         #テストしてみる
         ->  :
            Finished in 0.001814 seconds.
            0 tests, 0 assertions, 0 failures, 0 errors, 0 skips
              :
  ⑩vi app/models/post.rb
         -> validates :title, :presence => true, :length => {:maximum => 20} 
                        (項目) (入力必須)          (最大長20文字)          
                 # 項目ごとに設定できるため、可読性がよくなった SexyValidation 記法
  ⑪コンソールから確認
       rails c
          ->Post.create!
             ->ActiveRecord::RecordInvalid: Validation failed: Title can't be blank
          ->Post cretae! :title => 'ぽ' *21
             ->ActiveRecord::RecordInvalid: Validation failed: Title is too long
                 (maximum is 20 characters)

          ->Post cretae! :title => 'ぽsuと'
             ->INSERT INTO `posts` (`body`, `cre  .....
                追加されたOK!
          ->quit

■コメント投稿機能実装
  ①モデルとテーブル生成
     rails g model comment post:references comment:string name:string
     rake db:migrate
  ②コントローラ生成
     rails g controller comments
  ③投稿とコメント各データの関連を設定
     vi app/models/post.rb  -> has_many :comments を追加。

         ## modelで、post:references と指定すると、
         ## 自動的に、項目名が、post_idとなり、
         ## model上にも belongs_to:post が追加されるのね..

  ④コメントのためのルーティング
     vi config/routes.rb
        ->resources :posts do
             resources :comments, :only =>[:new, :create]
           end
  ⑤コメント投稿画面(ブログ記事詳細表示画面下部に設置)
     vi app/views/posts/show.html.erb
        -><hr>
          <%= render @post.comments.build %>
                # buildした commentsインスタンス をrender に渡すと
                # 規約で、comments/_comment という名前のパーシャルを指す。
 
  ⑥...なので、comment投稿フォーム作成は次のとおり
     vi app/views/comments/_comment.html.erb
        -> <%= form_for [comment.post, comment] do |f| %>
                  :
               <div class="field">
                 <%= f.submit %>
               </div>
            <% end -%>
  ⑦コメント登録アクションを実装
     vi app/controllers/comments_controller.rb
        -> def create
              post = Post.find params[:post_id]
              post.comments.create params[:comment]
              redirect_to post
            end
  ⑧最後に投稿されたコメントの表示(ブログ記事詳細表示画面下部に設置)
     vi app/views/posts/show.html.erb (以下を追加)
        -> <p>
              <b>comments</b>
              <% @post.comments.each do |comment| %>
                 <p><%= "#{comment.comment} by #{comment.name}" %></p>
              <% end -%>
            </p>

■ActiveModelで検索機能を実装
   Rails3から登場した「ActiveModel」を使えば、データベースのカラムと連動しない
   フィールドを持つモデルっぽいのが作れるらしい。
   これで、検索機能を作ってみる。

  ①モデル生成
     vi app/models/search_form.rb   (新規作成)

        -> class SearchForm
               extend ActiveModel::Naming
               include ActiveModel::Conversion      #この2行と persisted? で
                                                                #form_for の引数に使えるようになる。
                 :
               def initialize(param)
               end
  
               def persisted?
                 false
               end
            end

  ②検索フォームを一覧画面の先頭に設置
     vi app/views/posts/index.html.erb
        -> <%= form_for @search_form, :url =>posts_path, :html =>{:method =>:get} do |f| %>
               :
             <% end -%>   #シンボル :search_form 先に作ったモデルをあらわす。
                          

....

0 件のコメント:

コメントを投稿