Ruby on Rails/第1回集中勉強会 http://www.ark-web.jp/sandbox/wiki/4587.html
第一回集中勉強会 †
- 2009/07/18(土) 9:00〜15:00
- 参加者: 志田、竹村さん、大辻さん、斉藤君、大村さん、木幡さん、小林さん、浦屋さん、佐々木さん
- 目的: Railsの機能をコードを直接触りつつ、とにかく一通りの概要に触れる
セットアップ †
- railsはインストールされてるとして
$ rails mytwitter $ cd mytwitter $ ./script/server -p 3001
- http://yourdomain.com:3001/ をブラウザで表示
MVCの基本、RESTful Rails、scaffold †
ディレクトリ構成を見てみる †
$ 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でソースを見てみる †
- ヘルプを見てみる
$ ./script/generate scaffold
- ためしに作ってみる
$ ./script/generate scaffold status message:text
- テーブルをつくる
$ rake db:migrate
- 作られたものを動かしてみる
$ http://yourdomain.com:3001/statuses/
RailsのRESTful URL †
- 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 †
- 基本的な記述の仕方
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
コントローラーのソースを見てみる †
- 作られたファイルを見てみる
- モデルクラスを使ってビジネスロジックを実行させる
- @xxx のようにインスタンス変数にセットすれば、ビューから見られる
- respond_toは、HTML形式かXMLか、などフォーマットごとでレスポンスを分岐
デバッグ文を埋め込んで見る †
logger.debug "aaa"
モデルを見てみる †
- ActiveRecordを継承
- status.message のようなセッターゲッター
ビューを見てみる †
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があればそれが使われる
バリデーションさせてみよう †
- validate
投票できるようにしてみよう †
- 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に対応させよう †
- 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に対応させよう †
- 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
ページングさせてみよう †
†
* ActiveRecord * アソシエーション * プラグイン * RESTful Authenticationプラグイン * ActsAsXXX * RSpec, Fixture
tag: Ruby on Rails
![[PukiWiki] [PukiWiki]](image/sandbox.gif)



