okinawa.rb 第2回勉強会
Post on 19-Jan-2015
2.043 Views
Preview:
DESCRIPTION
TRANSCRIPT
2011/10/22
Okinawa.rb 第一回に参加した人・・・嘘› 発表資料はこちら
http://www.slideshare.net/yasulab/rails-tutorial-ch12(謝謝 @yasulab さん)
git が使える
rails 3.0 (最新は 3.1) rails インストールして、scaffold して、r s で
確認できる
「rails g scaffold blog …」で CRUD出来るの
はもう知ってるよ
複数のモデル(テーブル)の連携部分を深く掘り下げて考える
ActiveRecord::Associations の has_many なモデルのCRUD画面作成
「多対多」の関係(has_many :through)› routing, controller, view
隙を見て rails.vim の話やその他もろもろ... 仕様を満たしていくまでの考え方、開発リズ
ム› つっこみ歓迎w
設計してみよう
テニス(や卓球)のエントリ(申込)を表現してみよう
サンプルプログラムのソース› git@github.com:naopontan/my_entry.git
Aさんはログインして参加可能の大会の中から
自分の好きな大会を選びます。
次に種目(シングルス or ダブルス)を選択し
ます。
ダブルスの場合はパートナー一覧からパートナーを選びます
申込内容はいつでも確認できます
Aさんはログインして参加可能の大会の中から
自分の好きな大会を選びます。
次に種目(シングルス or ダブルス)を選択し
ます。
ダブルスの場合はパートナー一覧からパートナーを選びます
申込内容はいつでも確認できます
1つの大会は複数の種目を持つ
1つの種目は複数の申込を持つ
Userは複数の申込を持つ
User と “種目”は 多対多の関係だよね( user has_many events through => :entry)
大会
種目ユーザ
申込
competitionsidname
eventsidcompetition_id (FK)nameis_male
usersidnameis_male
entriesidevent_id (FK)user_id (FK)
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
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
% 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
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
テストデータが多すぎるのはNG› 例えば users.yml は 3人~5人 ぐらいじゃね?
› テストプログラムでパターンが足りない場合は動的にテストデータ生成
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?
そもそも has_many や belong_to の実装前
にテストから書く(ハズ)
Event#competition_id は必須?
大会名は必須?名前の重複は変だよね?
種目名が1つの大会で重複もしかり
最大文字数とかは?
...ということで最初は validation のOK/NGのテストとかになるはず...
r g scaffold User name:string is_male:boolean› db/migrate/*users_rb の boolean はnull, default を忘れ
ずに
fixutres は男性3人、女性1人ぐらいで
認証はプラグインで(devise, Sorcery, ...)› 権限も今回は無し
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
competitionsidname
eventsidcompetition_id (FK)nameis_male
usersidnameis_male
entriesidevent_id (FK)user_id (FK)
管理者
› 大会と種目の編集
› 会員一覧
› 申込み一覧
利用者
› 申込み一覧(自分のみ)
› 申込み
ログイン
大会一覧(種目一覧)
何から手をつけようか・・・
大会は scaffold のままでほとんどOK。
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つの大会に着目したときの、それにぶら下がる一覧
› とにかく全て(大会の域を超えて)の一覧 ←本当に必要か?
ここでは実際のソースを見ながら解説します
› 以下、一部抜粋
class EventsController < ApplicationControllerbefore_filter :find_competition
def new@event = @competition.events.new
end
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) %>
将来、権限機能を実装するのは明らかだ
› 基本、管理者は何でもできる
› ということは全てのUserの申込も操作できねば
› 申込の操作が実装できれば、後は「一般Userの申
込も流用できそうだ」
…ということで(私は)申込を users#show に実装することに決めた
<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 %>
competitionsidname
eventsidcompetition_id (FK)nameis_male
usersidnameis_male
entriesidevent_id (FK)user_id (FK)
entry.event.competition... が冗長だ
entry から competition は1つなのに... API 見ると delegate メソッド発見!
entry.competition って書けた。Happy! この辺りは経験とか勉強の度合いで感じ取る
› def competition; event.competition; end
class Entry < ActiveRecord::Basedelegate :competition, :to => :event...
ActiveRecord::Associations の has_many なモデルのCRUD画面作成
「多対多」の関係(has_many :through)› routing, controller, view
隙を見て rails.vim の話やその他もろもろ... 仕様を満たしていくまでの考え方、開発リ
ズム› つっこみ歓迎w
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
たくさんありすぎ… @IT自分戦略研究所
http://jibun.atmarkit.co.jp/scenter/ittrain/(1日1回、RSSフィードで地味にやってます)› ITトレメ Ruby技術者認定【Gold】試験
› ITトレメ Rails 3 技術者認定ブロンズ試験
top related