** 第一回集中勉強会 [#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]]