Okinawa.rb 第2回勉強会

33
2011/10/22

description

環境構築、Scaffoldの先に進んでみよう

Transcript of Okinawa.rb 第2回勉強会

Page 1: Okinawa.rb 第2回勉強会

2011/10/22

Page 2: Okinawa.rb 第2回勉強会

Okinawa.rb 第一回に参加した人・・・嘘› 発表資料はこちら

http://www.slideshare.net/yasulab/rails-tutorial-ch12(謝謝 @yasulab さん)

git が使える

rails 3.0 (最新は 3.1) rails インストールして、scaffold して、r s で

確認できる

Page 3: Okinawa.rb 第2回勉強会

「rails g scaffold blog …」で CRUD出来るの

はもう知ってるよ

複数のモデル(テーブル)の連携部分を深く掘り下げて考える

Page 4: Okinawa.rb 第2回勉強会

ActiveRecord::Associations の has_many なモデルのCRUD画面作成

「多対多」の関係(has_many :through)› routing, controller, view

隙を見て rails.vim の話やその他もろもろ... 仕様を満たしていくまでの考え方、開発リズ

ム› つっこみ歓迎w

Page 5: Okinawa.rb 第2回勉強会

設計してみよう

テニス(や卓球)のエントリ(申込)を表現してみよう

サンプルプログラムのソース› [email protected]:naopontan/my_entry.git

Page 6: Okinawa.rb 第2回勉強会

Aさんはログインして参加可能の大会の中から

自分の好きな大会を選びます。

次に種目(シングルス or ダブルス)を選択し

ます。

ダブルスの場合はパートナー一覧からパートナーを選びます

申込内容はいつでも確認できます

Page 7: Okinawa.rb 第2回勉強会

Aさんはログインして参加可能の大会の中から

自分の好きな大会を選びます。

次に種目(シングルス or ダブルス)を選択し

ます。

ダブルスの場合はパートナー一覧からパートナーを選びます

申込内容はいつでも確認できます

Page 8: Okinawa.rb 第2回勉強会

1つの大会は複数の種目を持つ

1つの種目は複数の申込を持つ

Userは複数の申込を持つ

User と “種目”は 多対多の関係だよね( user has_many events through => :entry)

Page 9: Okinawa.rb 第2回勉強会

大会

種目ユーザ

申込

Page 10: Okinawa.rb 第2回勉強会

competitionsidname

eventsidcompetition_id (FK)nameis_male

usersidnameis_male

entriesidevent_id (FK)user_id (FK)

Page 11: Okinawa.rb 第2回勉強会

r new my_entry› 要オプション確認: --skip-prototype, --skip-test-unit, etc…

cd my_entry bundle install git init git add . git commit –m ‘first commit’ rake db:migrate r s して http://localhost:3000/ にアクセス

git rm public/index.html

Page 12: Okinawa.rb 第2回勉強会

r g scaffold Competition name:string› config/routes.rb› test/fixtures/competitions.yml

(RSpec の場合はspec/fixtures/competions.yml)

% cat test/fixtures/competitionsone:

name: 招き猫オープン

two:name: 閑古鳥杯

rake db:migrate

Page 13: Okinawa.rb 第2回勉強会

% cat test/fixtures/eventsone:

competition_id: 1name: MyStringis_male: false

two:...

r g scaffold Event competition_id:integer name:string is_male:boolean

「大会」と関連付けるため、上記を修正

boolean 型の注意点t.boolean :is_male, :null => false, :default => true

Page 14: Okinawa.rb 第2回勉強会

rake db:fixtures:load でテストデータを読み込み

% cat test/fixtures/eventsone:

competition: onename: 18歳以下男子シングルスis_male: true

two:competition: onename: 18歳以下女子シングルスis_male: false

three:...

% cat app/model/event.rbclass Event < ActiveRecord::Base

belongs_to :competitionend

Page 15: Okinawa.rb 第2回勉強会

テストデータが多すぎるのはNG› 例えば users.yml は 3人~5人 ぐらいじゃね?

› テストプログラムでパターンが足りない場合は動的にテストデータ生成

Page 16: Okinawa.rb 第2回勉強会

r c› Competition.all› Event.all› Event.first› Event.all[0].competition› Event.all[0].competition.event # ←エラー

% cat app/model/competition.rbclass Event < ActiveRecord::Base

has_many :eventsend

competition has many events› Event.all[0].competition.event # ←Good!› Competition.find_by_name(‘閑古鳥杯’).events.empty?

Page 17: Okinawa.rb 第2回勉強会

そもそも has_many や belong_to の実装前

にテストから書く(ハズ)

Event#competition_id は必須?

大会名は必須?名前の重複は変だよね?

種目名が1つの大会で重複もしかり

最大文字数とかは?

...ということで最初は validation のOK/NGのテストとかになるはず...

Page 18: Okinawa.rb 第2回勉強会

r g scaffold User name:string is_male:boolean› db/migrate/*users_rb の boolean はnull, default を忘れ

ずに

fixutres は男性3人、女性1人ぐらいで

認証はプラグインで(devise, Sorcery, ...)› 権限も今回は無し

Page 19: Okinawa.rb 第2回勉強会

r g model Entry event_id:integer user_id:integer

test/fixtures/entries.yml% cat app/model/entry.rbclass Entry < ActiveRecord::Base

belongs_to :eventbelongs_to :user

end

% cat app/model/event.rbclass Event < ActiveRecord::Base

has_many :entrieshas_many :users, :through => :entries

end

% cat app/model/user.rbclass User < ActiveRecord::Base

has_many :entrieshas_many :events, :through => :entries

end

Page 20: Okinawa.rb 第2回勉強会

competitionsidname

eventsidcompetition_id (FK)nameis_male

usersidnameis_male

entriesidevent_id (FK)user_id (FK)

Page 21: Okinawa.rb 第2回勉強会

管理者

› 大会と種目の編集

› 会員一覧

› 申込み一覧

利用者

› 申込み一覧(自分のみ)

› 申込み

ログイン

大会一覧(種目一覧)

何から手をつけようか・・・

大会は scaffold のままでほとんどOK。

Page 22: Okinawa.rb 第2回勉強会

rake routes | grep events で基本を把握する

competition has_many events を routes.rb で表現

› events を competition にぶら下げる

› そして、再度 rake routes | grep events

* config/routes.rb *resources :usersresources :competitions do

resources :events, :except => [:index]end

種目の一覧って2通り考えられる?

› 1つの大会に着目したときの、それにぶら下がる一覧

› とにかく全て(大会の域を超えて)の一覧 ←本当に必要か?

Page 23: Okinawa.rb 第2回勉強会

ここでは実際のソースを見ながら解説します

› 以下、一部抜粋

class EventsController < ApplicationControllerbefore_filter :find_competition

def new@event = @competition.events.new

end

Page 24: Okinawa.rb 第2回勉強会

competitions#show に種目の CRUD を挿入

<p><b>Name:</b><%= @competition.name %>

</p>

<table border="1"><tr><th>Name</th><th>Is male</th><th></th><th></th><th></th>

</tr><%= render @competition.events %>

</table><%= link_to 'New Event', new_competition_event_path(@competition) %>

Page 25: Okinawa.rb 第2回勉強会

将来、権限機能を実装するのは明らかだ

› 基本、管理者は何でもできる

› ということは全てのUserの申込も操作できねば

› 申込の操作が実装できれば、後は「一般Userの申

込も流用できそうだ」

…ということで(私は)申込を users#show に実装することに決めた

Page 26: Okinawa.rb 第2回勉強会

<table border="1"><tr><th>Competition</th><th>Event</th><th></th>

</tr><% @user.entries.each do |entry| %><tr><td><%= entry.event.competition.name %></td><td><%= entry.event.name %></td><td><%= link_to 'Cancel', entry, :confirm => 'Are you sure?', :method => :delete %></td>

</tr><% end %>

</table>

<h2>申込</h2><%= form_tag(entries_path, :method => :get) do %><%= ("competition", "id", Competition.all.collect {|| [ .name, .id ] }) %><%= hidden_field_tag :user_id, @user.id %><%= submit_tag '次へ' %>

<% end %>

Page 27: Okinawa.rb 第2回勉強会

competitionsidname

eventsidcompetition_id (FK)nameis_male

usersidnameis_male

entriesidevent_id (FK)user_id (FK)

Page 28: Okinawa.rb 第2回勉強会

entry.event.competition... が冗長だ

entry から competition は1つなのに... API 見ると delegate メソッド発見!

entry.competition って書けた。Happy! この辺りは経験とか勉強の度合いで感じ取る

› def competition; event.competition; end

class Entry < ActiveRecord::Basedelegate :competition, :to => :event...

Page 29: Okinawa.rb 第2回勉強会
Page 30: Okinawa.rb 第2回勉強会

ActiveRecord::Associations の has_many なモデルのCRUD画面作成

「多対多」の関係(has_many :through)› routing, controller, view

隙を見て rails.vim の話やその他もろもろ... 仕様を満たしていくまでの考え方、開発リ

ズム› つっこみ歓迎w

Page 31: Okinawa.rb 第2回勉強会

Agile Web Development with Rails (4th edition)http://pragprog.com/book/rails4/agile-web-development-with-rails

RailsによるアジャイルWebアプリケーション開発 第3版(注意!Rails2 です)http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06785-3

Page 32: Okinawa.rb 第2回勉強会

たくさんありすぎ… @IT自分戦略研究所

http://jibun.atmarkit.co.jp/scenter/ittrain/(1日1回、RSSフィードで地味にやってます)› ITトレメ Ruby技術者認定【Gold】試験

› ITトレメ Rails 3 技術者認定ブロンズ試験

Page 33: Okinawa.rb 第2回勉強会