ごきげんrails
DESCRIPTION
Presentation for MinatoRubyKaigi01, talking about Ruby on Rails. Written in Japanese.TRANSCRIPT
みなとRuby会議01
株式会社万葉
ごきげんRails2012.6.2
大場寧子 @nay3
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
みなとRuby会議01開催おめでとうございます
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Yokohama2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Ruby on Rails
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Railsって?
•RubyでWebアプリを作れるフレームワーク•簡単に作れる!•でも本当に簡単?
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
ちょっと難しいかも...
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
環境作りが大変
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
でも動きはじめたら勢いよく出来る
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
...慣れればね!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
今日の話題
•RubyやRailsでごきげんになった話•Railsの魅力•Railsの勉強法
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
自己紹介
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
株式会社万葉Everyleaf Corp.
女性メンバーいっぱいいますよ! :)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
実装大好き
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
実装やめないために会社作りました
(^^;
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
RubyとRailsのおかげです
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
本が出ます(そのはずです)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
たのしい開発スタートアップRuby
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Railsの魅力
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
生産性2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
とても高い!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
プログラマにとって気持ちイイ方向に「生産性が高い」
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
「時間をかけるべきこと」に
時間をかけられる
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間をかけるべきこと
•設計•コミュニケーション・情報共有•スペック/自動テストの充実
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間を節約したいこと
•定型的な作業•作業ミスとリカバリー•変更時の動作確認•コード内容の把握
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
定型的な作業•新しいモデルの作成•新しいコントローラの作成•データベーススキーマの更新→ generator、マイグレーション
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
generator> rails g model User name:string email:string
> rails g controller Users index show
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
generator
•ひな形が簡単に得られる•あくまでもひな形で、邪魔にならないのがいいところ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
足りない 適切 やり
すぎ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
マイグレーション•DBのスキーマ更新を、変更ごとにRubyコードとして保存•開発者間で変更をクールにシェアできる
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
changeclass CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name, :null => false t.string :name_kana, :null => false t.string :email, :null => false t.string :password_hash t.string :password_salt t.timestamps end endend
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
up & downclass RemoveNameKanaInUsers < ActiveRecord::Migration def up remove_column :users, :name_kana end def down add_column :users, :name_kana, :string endend
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
マイグレーション•generatorで作成して•記述追加したりして•ローカル環境に当てて確認•> rake db:migrate•レポジトリにコミット
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
某Rails似フレームワークでmigration大変だった;;
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
指差し確認しないと
マイグレートできない...orz
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コマンド成功しても生成物に問題が...orz
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
足りない 適切 やり
すぎ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
某migrationBad Points
•コード複雑、自動生成頼み•モデルクラスのコードとつよく依存•中央集権型なので、複数開発者の同時更新に弱い•操作体系が複雑でミスしやすい
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
RailsのmigrationGood Points
•手書きできるレベルのコード•モデルクラスのコードと分離されている•複数開発者の同時更新に強い•操作体系がシンプル
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間を節約したいこと
•定型的な作業•作業ミスとリカバリー•変更時の動作確認•コード内容の把握
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
作業ミスとリカバリー•比較的ミスしづらい•rails destroy で generateしたものを簡単に消せる•一貫性があって覚えやすい
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間を節約したいこと
•定型的な作業•作業ミスとリカバリー•変更時の動作確認•コード内容の把握
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
変更時の動作確認
•スペック/テスト•RSpec おすすめです!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
RSpecの話
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
自動テスト嫌いでした
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
JUnitの頃...※10年前?もっと?
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テストが嫌いだった理由•プロダクトコードを変更したくなくなる(大量に落ちるから)•データ作りがハード•テストコード楽しくない•書いたテストは読む気がしない•テスト修正作業は最悪だ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
プロダクトコードを変更したくなくなる
•大量に落ちる→修正苦痛•変更に耐えるテスト/スペックが重要!!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
変更に耐えるテスト/スペック
のコツ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
「関心事」にフォーカスする
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
すべてを確認しない
レイヤーを揃える
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
•保存できる•既存レコードなんか調べない!•全カラムを調べたりしない!•返り値が20になる•内部の変数の値とか調べない!•ステータスコード200を期待•セッション状態とか見ない!•インスタンス変数の値なんか調べない!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
全部調べると
•内部の変更に弱い•つまり、リファクタリングに弱くなる•コード読んでも意図不明•心配なら別のケースにする
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
DRYにする(特にオブジェクト生成)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
FactoryGirl
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Factory.create(:project)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テストが嫌いだった理由•プロダクトコードを変更したくなくなる(大量に落ちるから)•データ作りがハード•テストコード楽しくない•書いたテストは読む気がしない•テスト修正作業は最悪だ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
FactoryGirl
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
FactoryGirlはActiveRecordの理解が必要
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テストが嫌いだった理由•プロダクトコードを変更したくなくなる(大量に落ちるから)•データ作りがハード•テストコード楽しくない•書いたテストは読む気がしない•テスト修正作業は最悪だ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
assert_equal 20, obj.result
検査してね、20のはずなんで、えーとそのobj.resultね
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
obj.result.should == 20
obj.result はー、20になりまーす
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
RSpec楽しい
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
結果を確認してるんじゃないんだ仕様を書いている
んだぜ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
やる気が出る!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
いろいろ強力で快適!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テストが嫌いだった理由•プロダクトコードを変更したくなくなる(大量に落ちるから)•データ作りがハード•テストコード楽しくない•書いたテストは読む気がしない•テスト修正作業は最悪だ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
うまく書かれたRSpecコードはドキュメントとして
読める
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
describe Project do
describe "#close" do let(:proj) {Factory.create(:project, :closed => true)}
context "when closed" do it {expect{proj.close}.to raise_error} end
endend
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テストが嫌いだった理由•プロダクトコードを変更したくなくなる(大量に落ちるから)•データ作りがハード•テストコード楽しくない•書いたテストは読む気がしない•テスト修正作業は最悪だ!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
テスト修正はやっぱり
楽しくない('w'2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
修正箇所が減って意図がわかりやすい
のでマシ...
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間を節約したいこと
•定型的な作業•作業ミスとリカバリー•変更時の動作確認•コード内容の把握
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コード内容の把握
•何がどこに書かれるべきか決まっている→探しやすい•Rubyはコード量が少ないので読みやすい
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
...うまく書ければね!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
把握しやすいコードを書くコツ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Rubyらしいコードを書く
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
each や for を多用していますか?
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
map/collect使っていますか?
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
user_names = []users.each do |u| user_names << u.nameend
users.map(&:name)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
良い名前をつける
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
値をもらうことが目的のメソッドには処理ではなく返す値の名前をつける
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
calc_salaryより
salary2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Q) 変数名と見分けがつかないのが心配なんですが
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
A)変数のように見えるメソッド名こそRubyらしい
(変数なんて無いほうがいい!)
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
railsのコードをちょっと見て雰囲気つかむのも
おすすめ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
正しい場所に書く
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
MVC?2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
オブジェクト指向!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
誰の仕事にするか考える
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
適切なオブジェクトがなければ作る
class NiceObject
end2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
こういうのは悪いサイン
obj.name = params....obj.age = params...v = obj.prepare_someobj.prepare2(v)...同じオブジェクトについての処理が続いている
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
オブジェクト側に移動しよう
obj.name = params....obj.age = params...v = obj.prepare_someobj.prepare2(v)...
コントローラ モデルobj
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
移動すると
def do_some(attributes) self.name = attributes... self.age = attributes... v = prepare_some prepare2(v) ...
obj.do_some(params)コントローラ
モデル
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
objがモデルならコールバックに移動できる
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コールバック•before_validation•before_save•after_save•before_destroy•after_destroy•etc....
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コントローラコードはこんなかんじに保つ
@project = Project.new(params[:project])if @project.save ...else ...end
一括代入
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
params関係が溢れたら
•一括代入に乗るように、paramsの中身を整えて、代入メソッドを追加してやる
attr_accessor :age
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
ロジックが溢れたら•コールバック(before_validationとbefore_saveが多い)に入れる
before_save :prepare_some2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
例外処理
•気にしない•アクション内でがんばらずにあとでrescue_fromとかで調整がおすすめ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
スペックを書いておくと動作を他人に伝えやすい
コード内容の把握最後のコツ
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間を節約したいこと•定型的な作業•作業ミスとリカバリー•変更時の動作確認•コード内容の把握Railsかわいい!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
時間をかけるべきこと
•設計•コミュニケーション・情報共有•スペック/自動テストの充実
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Railsを使うだけでは解決しない
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
気をつけていること•モデル層はクラス図を書く•URL設計は表にする•必要物は全部レポジトリに•Wikiに概要や検討を残す•よく話し合う•レビューする
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Railsの勉強法
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
アプリを作ってみよう
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
興味のあるものを作る
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
偏っててOK
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
実現したい!と強く思う
方法を探す調べる
試す身に付く!
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
情報源2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
書籍
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
APIhttp://api.rubyonrails.org/
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
Rails Guidehttp://guides.rubyonrails.org/
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
RailsCastshttp://railscasts.com/
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
英語の情報を避けない
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コミュニティ/勉強会•地域Rubyコミュニティ•Yokohama.rb•Asakusa.rb•minami.rb•Okinawa.rb•Tokyu.rb etc•Rails勉強会@東京
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
コードを読む
•> rvm gemdir
•github
2012年6月4日月曜日
株式会社万葉
みなとRuby会議01
ごきげんになろう! :)
2012年6月4日月曜日