** 第一回集中勉強会 [#yaff99e1]
 
 - 2009/07/18(土) 9:00〜15:00
 - 参加者: 志田、竹村さん、大辻さん、斉藤君、大村さん、木幡さん、小林さん、浦屋さん、佐々木さん
 - 目的: Railsの機能をコードを直接触りつつ、とにかく一通りの概要に触れる
 
 ** セットアップ [#mc456c3c]
 
 - railsはインストールされてるとして
  $ rails mytwitter
  $ cd mytwitter
  $ ./script/server -p 3001
 - http://yourdomain.com:3001/ をブラウザで表示
 
 ** MVCの基本、RESTful Rails、scaffold [#aadac6e9]
 
 *** ディレクトリ構成を見てみる [#ge82bb1e]
  $ ls -1 mytwitter
  app/ <- MVC + View用の便利関数(helpers)
    +- controllers  
    +- helpers
    +- models
    +- views
  config
    +- database.yml   <- データベース設定
    +- environment.rb <- アプリの基本的挙動の設定
    +- environments   <- 環境ごとの設定
    +- locales        <- 多言語化
    +- routes.rb      <- URLの設定
  +- db             <- migrationなど
  +- doc
  +- lib            <- rake taskなど
  +- log            <- 環境毎のログ
  +- public         <- ドキュメントルート
  +- script         <- generateコマンドなど
  +- test           <- unit test
  +- tmp            <- セッションファイルとか
  +- vendor         <- pluginとか
 
 *** scaffoldでソースを見てみる [#b6b4fc6c]
 
 - ヘルプを見てみる
  $ ./script/generate scaffold
 - ためしに作ってみる
  $  ./script/generate scaffold status message:text
 - テーブルをつくる
  $ rake db:migrate
 - 作られたものを動かしてみる
  $ http://yourdomain.com:3001/statuses/
 
 *** RailsのRESTful URL [#d1bb13da]
 
 - Module: ActionController::Resources 
 http://api.rubyonrails.org/classes/ActionController/Resources.html
 
 |つぶやき一覧|GET /statuses/|statuses_path|
 |つぶやき新規追加|GET /statuses/new|new_status_path|
 |つぶやき追加処理|POST /statuses/||
 |つぶやき個別閲覧|GET /statuses/1|status_path(@status)|
 |つぶやき編集|GET /statuses/edit/1|edit_status_path(@status)|
 |つぶやき編集処理|PUT /statuses/1 (METHOD: POST, _method=put)||
 |つぶやき削除|DELETE /statuses/1 (METHOD: POST, _method=delete)||
 
 *** config/route.rb [#v6924494]
 
 - 基本的な記述の仕方
 
 Module: ActionController::Routing 
 http://api.rubyonrails.org/classes/ActionController/Routing.html
 
 - 次の情報が追加されてます
  map.resources :statuses
 
 Module: ActionController::Resources 
 http://api.rubyonrails.org/classes/ActionController/Resources.html#M000544
 
 
 
 *** コントローラーのソースを見てみる [#mea46989]
 
 - 作られたファイルを見てみる
 - モデルクラスを使ってビジネスロジックを実行させる
 - @xxx のようにインスタンス変数にセットすれば、ビューから見られる
 - respond_toは、HTML形式かXMLか、などフォーマットごとでレスポンスを分岐
 
 
 *** デバッグ文を埋め込んで見る [#v686879f]
 
  logger.debug "aaa"
 
 *** モデルを見てみる [#j1a693ea]
 
 - ActiveRecordを継承
 - status.message のようなセッターゲッター
 
 
 *** ビューを見てみる [#f5f7339e]
 
 ''indexアクション''
 
 - link_to
 - url_for
 - statuses_path
 - status_path(@status)
 
 ''newアクション''
 
 - form_for
 
 ''createアクション''
 
 - saveメソッド
 - flashについて
 - rendor :action について
 - layoutについて
 -- StatusesControllerのように、app/views/layouts/statuses.html.erb のように同名のlayoutがあればそれが使われる
 
 
 *** バリデーションさせてみよう [#ed86c7a2]
 
 - validate
 
 ** 投票できるようにしてみよう [#ta5dc63b]
 
 - vote_count int
 - migrateで追加しよう
 
  class AddVoteCountColumnToStatuses < ActiveRecord::Migration
    def self.up
      add_column :statuses, :vote_count, :integer
    end 
  
    def self.down
      remove_column :statuses, :vote_count
    end
  end
 - フォーム部分をパーシャル化しよう
  <%= render :partial => "form", :locals =>{:f =>f} %>
 - _form.html.erb
   <p>
     <%= f.label :message, 'messssage' %><br />
     <%= f.text_field :message %>
   </p>
   <p> 
     <%= f.label :vote_count %><br />
     <%= f.text_field :vote_count %>  </p>
 
 ** Ajaxに対応させよう [#u2d5efcd]
 
 - routes.rbのmap.resources :statusesを次のように書き換える
   map.resources :statuses, :collection =>{:countup =>:put}
 - モデルに「countup!」を追加する
   def countup!
     self.vote_count = 0 if self.vote_count.blank?
     self.vote_count = self.vote_count + 1
     save
   end
 - コントローラーに「countup」を追加する
   def countup
     @status = Status.find(params[:id])
     @status.countup!
     render :text => @status.vote_count
   end
 - ビューで、カウントアップさせる場所をID値をつけて、
  <td><span id='vote_count_<%=h status.id %>'><%=h status.vote_count %></span></td>
 - link_to_remoteでupdateさせる
  <td><%= link_to_remote 'Count UP!', :update => 'vote_count_' + status.id.to_s, :url => {:controller => :statuses, :action => :countup, :id => status.id} %></td>
 
 ** RJSに対応させよう [#se2e4fdf]
 
 - link_to_remote から :update をとる
 - controllerの中身はcountupだけにする
    def countup
     @status = Status.find(params[:id])
     @status.countup!
   end
 - RJSのテンプレートファイルcountup.js.rjsを用意する
  page.replace_html 'vote_count_' + @status.id.to_s, @status.vote_count
 - visual_effectをつけてみよう
  page.visual_effect :highlight, 'vote_count_' + @status.id.to_s
 
 ** ページングさせてみよう [#vdbf3f39]
 
 - 
 
 ** [#bd242df5]
  * ActiveRecord
    * アソシエーション
  * プラグイン
    * RESTful Authenticationプラグイン
    * ActsAsXXX
  * RSpec, Fixture
 
 #blikifooter(志田)
 
 tag: [[Ruby on Rails>tag/Ruby on Rails]]
 

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら