狠狠撸

狠狠撸Share a Scribd company logo
RUBY ON RAILS 3 Tutorial  を日本語訳してみた Chapter 5-7 2011/11/10
おさらい 前回 Chapter4 を軽く飛ばしました rails console コマンドの話 Ruby の文法的部分の話だったので、このまま飛ばします Chapter3 では TDD(Test Driven Development)
目次 Chapter1 Rails 導入からデプロイ Chapter2  デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5  スタイルを追加する Chapter6 User Model と View  その 1 Chapter7 User Model と View  その 2
目次 Chapter8  ユーザ登録 Chapter9  ログイン?ログアウト Chapter10  ユーザデータの更新?編集?追加 Chapter11  ミニブログ ( ツイート ) Chapter12  ユーザのフォロー
Chapter5 Filling in the Layout CSS を追加する話 レイアウトの話なので、気になった所のみ
5.2.1 Integration Tests routes.rb を触る前に Integration test( 結合テスト ) を行う テスト用 spec ファイル作成 ※ RSpec では integration tests のことを request specs と言う $ rails generate integration_test layout_links invoke  rspec create   spec/requests/layout_links_spec.rb
5.2.1 Integration Tests spec/requests/layout_links_spec.rb  に以下のテストを追加 describe ? " GET 'home' " ? do ?? it ? " should be successful " ? do ???? get ? ' home ' ???? response .should be_success ?? end end
5.2.1 Integration Tests 自動でテストが実行されない場合 .autotest に追加 Mac OS X の場合 Autotest . add_hook   :initialize   do   | autotest | autotest . add_mapping( /^specrequests.*_specrb$/ )   do autotest . files_matching( /^specrequests.*_specrb$/ ) end end
5.2.1 Integration Tests Ubuntu か Linux の場合 Autotest . add_hook   :initialize   do   | autotest| autotest . add_mapping( %r%^spec/(requests)/.*rb$% )   do | filename,   _ | filename end end   ?
5.2.2 Rails Routes URL マッピングは config/routes.rb で routes.rb 例: :to => ‘ コントローラ名 # アクション名’ SampleApp :: Application .routes.draw ? do ?? match ? ' /contact ' , ? :to ?=> ? ' pages#contact ' ?? match ? ' /about ' ,?? ? :to ?=> ? ' pages#about ' ?? match ? ' /help ' ,???? :to ?=> ? ' pages#help ' end ?
5.4 Conclusion CSS の当て方 route.rb の使い方 link_to の使いかた
目次 Chapter1 Rails 導入からデプロイ Chapter2  デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5  スタイルを追加する Chapter6 User Model と View  その 1 Chapter7 User Model と View  その 2
Chapter6 Modeling and Viewing Users, PartⅠ ( 前提 ) ユーザがログインするシステムを作っている途中 ユーザモデルの作成 DB のテーブル作成 バリデーション
Box 6.1  Roll Your Own Authentication System OpenID や OAuth Rails に備わっている認証モジュール それらを使わずに認証を自作すべし
Rails の認証に答えが無いから チュートリアルで扱っても時代遅れになる可能性 正しい方法を示しても、古くなってしまう Rails と認証の両方の勉強になる Box 6.1  Roll Your Own Authentication System
6.1.1 Database Migration User コントローラ作成 (new アクション付き ) User モデル作成 (name と email を持っている ) $ rails g controller Users new $ rails g model User name:string email:string
6.1.1 Database Migration DB 作成 DB 削除 $ bundle exec rake db:migrate $ bundle exec rake db:rollback “ bundle?exec を使うと、 BUNDLE_PATH 以下の gem を使って、スクリプトを実行できます。” ( http://d.hatena.ne.jp/mirakui/20100703/1278165723 )
6.1.2 The Model File Model Annotation annotate という gem を入れる Gemfile に’ annotate’ 追加 ※ 注意  :git=> 以下を追加しないと 3.1 系で動かない https://github.com/ctran/annotate_models/issues/28 group? :development ? do ?? gem ? ' rspec-rails ' ?? gem ? ' annotate ' ,? :git ?=>? ' git://github.com/ctran/annotate_models.git ' end ?
6.1.2 The Model File 実行結果 $ bundle exec annotate --position before # == Schema Information # # Table name: users # #??id???????? :integer???????? not null, primary key #??name?????? :string(255) #??email??????:string(255) #??created_at :datetime #??updated_at :datetime # class ? User ?<? ActiveRecord :: Base end ? 追加されている
6.1.3 Creating user objects --sandbox で DB には変更を加えない -f オプションで常に最新のログを見れる $ rails console --sandbox $ tail –f log/development.log
6.2 User Validations  TDD のため、 development DB の 構造 を test DB に反映させる $ bundle exec rake db:test:prepare
6.2.3 Format Validation email 等のバリデーション用正規表現 Rubular(http://rubular.com/) 正規表現の入力  ->マッチするか確認
6.2.3 Format Validation 余談 (Gmail の場合 ) 例えば… + やスペースなどのメールアドレスに使えない記号もバリデーションで許可必要 test@gmail.com == test+hoge@gmail + から @ 前までが無視される
6.3.1 Debug and Rails Environments Rails の環境 test( テスト用 ) development( 開発用 ) app 以下のコード変更が常に反映される production( 本番環境 ) コード変更反映にはサーバーの再起動必要。こちらのほうが早い http://d.hatena.ne.jp/zariganitosh/20070108/1168246932
6.3.1 Debug and Rails Environments Rails console のデフォルトは development console で以下のメソッドで確認可能 >> Rails.env => “development” >> Rails.env.development? => “true” >> Rails.env.test? => “false”
6.3.1 Debug and Rails Environments 環境を指定して実行出来る Rails を動かすときも環境指定可能 $ rails console test $ rails server --environment production
6.3.1 Debug and Rails Environments production 環境の DB を構築する ちなみに heroku console で試すと、 Heroku は production 環境であることが分かる $ bundle exec rake db:migrate RAILS_ENV=production
目次 Chapter1 Rails 導入からデプロイ Chapter2  デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5  スタイルを追加する Chapter6 User Model と View  その 1 Chapter7 User Model と View  その 2
ユーザのログイン周り パスワード暗号化 ユーザの個人ページ作成 Gravatar を利用する gem Chapter7 Modeling and Viewing Users, PartⅡ
7.2.2 Some Secure Password Theory ユーザのログイン パスワードハッシュ化して比較
7.2.2 Some Secure Password Theory $ rails console   >>  require   'digest'   >>  def   secure_hash (string)   >>  Digest :: SHA2 . hexdigest(string)   >>  end >>  password   =   &quot;secret&quot;   >>  encrypted_password   =   secure_hash(password)   “ 2bb80d537b1da3e38bd30361aa85…( 省略 )&quot;   >>  submitted_password   =   &quot;secret&quot;   >>  encrypted_password   ==   secure_hash(submitted_password)   => true   ?
7.2.2 Some Secure Password Theory rainbow attack ( 事前計算攻撃 / レインボー攻撃 ) http://michisugara-aud.sakura.ne.jp/lectures/lectures_25.html パスワードが類推される可能性がある -> salt ( 今回は現在時刻の文字列 ) を利用する ハッシュ関数 (pass) を ハッシュ関数 ( 時刻 +pass) に
7.2.2 Some Secure Password Theory >>  Time . now . utc   => Fri Jan 29 18:11:27 UTC 2010   >>  password   =   &quot;secret&quot;   => &quot;secret&quot;   >>  salt   =   secure_hash( &quot; #{ Time . now . utc } -- #{ password } &quot; )   => &quot;d1a3eb8c9aab32ec19cfda810d2ab351873b5dca4e16e7f57b3c1932113314c8&quot;   >>  encrypted_password   =   secure_hash( &quot; #{ salt } -- #{ password } &quot; )   => &quot;69a98a49b7fd103058639be84fb88c19c998c8ad3639cfc5deb458018561c847&quot;   ? ※ 明確にするため、ハッシュ化する文字列は” --” で区切られるらしい
7.2.3 Implementing has_password? User モデルに salt フィールド追加する migration の設定 db/migrate/<timestamp>_add_salt_to_users.rb が作成される migration 名 (add_password_to_users) は自由 ※ _to_users にしておくと、自動で User に追加される!便利! $ rails generate migration add_password_to_users encrypted_password:string
作成した migration の実行 7.2.3 Implementing has_password? $ bundle exec rake db:migrate $ bundle exec rake db:test:prepare sqlite> .schema CREATE TABLE &quot;schema_migrations&quot; (&quot;version&quot; varchar(255) NOT NULL); CREATE TABLE &quot;users&quot; (&quot;id&quot; INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, &quot;name&quot; varchar(255), &quot;email&quot; varchar(255), &quot;created_at&quot; datetime, &quot;updated_at&quot; datetime,  &quot;salt&quot; varchar(255));
7.3.2 A Name and a Gravatar Gemfile に gravatar_image_tag 追加 Gravatar(http://gravatar.com) を利用する gem <%= gravatar_image_tag ‘email’ %> これだけで、登録された email のアイコンを表示してくれる       ← Gravatar に登録がない場合に表示される
今回のまとめ 5 章では CSS の導入的な話 User モデルの作り方について、 6 ? 7 章だった 全体的にざっくり削った Tutorial ではちゃんとテストする過程がある RSpec のコードも載っていたが割愛 Heroku ? Git も使っている ( 章毎に push している )
次回予告 8 章  Sign Up  新規登録 9 章  Sign In, Sign Outs  セッション周り 10 章  Updating, Showing, and Deleting Users うまく行けば、次の次の回で最終回…? ( 全 12 章 )

More Related Content

Ruby on Rails Tutorial Chapter5-7

  • 1. RUBY ON RAILS 3 Tutorial を日本語訳してみた Chapter 5-7 2011/11/10
  • 2. おさらい 前回 Chapter4 を軽く飛ばしました rails console コマンドの話 Ruby の文法的部分の話だったので、このまま飛ばします Chapter3 では TDD(Test Driven Development)
  • 3. 目次 Chapter1 Rails 導入からデプロイ Chapter2 デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5 スタイルを追加する Chapter6 User Model と View その 1 Chapter7 User Model と View その 2
  • 4. 目次 Chapter8 ユーザ登録 Chapter9 ログイン?ログアウト Chapter10 ユーザデータの更新?編集?追加 Chapter11 ミニブログ ( ツイート ) Chapter12 ユーザのフォロー
  • 5. Chapter5 Filling in the Layout CSS を追加する話 レイアウトの話なので、気になった所のみ
  • 6. 5.2.1 Integration Tests routes.rb を触る前に Integration test( 結合テスト ) を行う テスト用 spec ファイル作成 ※ RSpec では integration tests のことを request specs と言う $ rails generate integration_test layout_links invoke rspec create spec/requests/layout_links_spec.rb
  • 7. 5.2.1 Integration Tests spec/requests/layout_links_spec.rb  に以下のテストを追加 describe ? &quot; GET 'home' &quot; ? do ?? it ? &quot; should be successful &quot; ? do ???? get ? ' home ' ???? response .should be_success ?? end end
  • 8. 5.2.1 Integration Tests 自動でテストが実行されない場合 .autotest に追加 Mac OS X の場合 Autotest . add_hook :initialize do | autotest | autotest . add_mapping( /^specrequests.*_specrb$/ ) do autotest . files_matching( /^specrequests.*_specrb$/ ) end end
  • 9. 5.2.1 Integration Tests Ubuntu か Linux の場合 Autotest . add_hook :initialize do | autotest| autotest . add_mapping( %r%^spec/(requests)/.*rb$% ) do | filename, _ | filename end end ?
  • 10. 5.2.2 Rails Routes URL マッピングは config/routes.rb で routes.rb 例: :to => ‘ コントローラ名 # アクション名’ SampleApp :: Application .routes.draw ? do ?? match ? ' /contact ' , ? :to ?=> ? ' pages#contact ' ?? match ? ' /about ' ,?? ? :to ?=> ? ' pages#about ' ?? match ? ' /help ' ,???? :to ?=> ? ' pages#help ' end ?
  • 11. 5.4 Conclusion CSS の当て方 route.rb の使い方 link_to の使いかた
  • 12. 目次 Chapter1 Rails 導入からデプロイ Chapter2 デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5 スタイルを追加する Chapter6 User Model と View その 1 Chapter7 User Model と View その 2
  • 13. Chapter6 Modeling and Viewing Users, PartⅠ ( 前提 ) ユーザがログインするシステムを作っている途中 ユーザモデルの作成 DB のテーブル作成 バリデーション
  • 14. Box 6.1 Roll Your Own Authentication System OpenID や OAuth Rails に備わっている認証モジュール それらを使わずに認証を自作すべし
  • 15. Rails の認証に答えが無いから チュートリアルで扱っても時代遅れになる可能性 正しい方法を示しても、古くなってしまう Rails と認証の両方の勉強になる Box 6.1 Roll Your Own Authentication System
  • 16. 6.1.1 Database Migration User コントローラ作成 (new アクション付き ) User モデル作成 (name と email を持っている ) $ rails g controller Users new $ rails g model User name:string email:string
  • 17. 6.1.1 Database Migration DB 作成 DB 削除 $ bundle exec rake db:migrate $ bundle exec rake db:rollback “ bundle?exec を使うと、 BUNDLE_PATH 以下の gem を使って、スクリプトを実行できます。” ( http://d.hatena.ne.jp/mirakui/20100703/1278165723 )
  • 18. 6.1.2 The Model File Model Annotation annotate という gem を入れる Gemfile に’ annotate’ 追加 ※ 注意 :git=> 以下を追加しないと 3.1 系で動かない https://github.com/ctran/annotate_models/issues/28 group? :development ? do ?? gem ? ' rspec-rails ' ?? gem ? ' annotate ' ,? :git ?=>? ' git://github.com/ctran/annotate_models.git ' end ?
  • 19. 6.1.2 The Model File 実行結果 $ bundle exec annotate --position before # == Schema Information # # Table name: users # #??id???????? :integer???????? not null, primary key #??name?????? :string(255) #??email??????:string(255) #??created_at :datetime #??updated_at :datetime # class ? User ?<? ActiveRecord :: Base end ? 追加されている
  • 20. 6.1.3 Creating user objects --sandbox で DB には変更を加えない -f オプションで常に最新のログを見れる $ rails console --sandbox $ tail –f log/development.log
  • 21. 6.2 User Validations TDD のため、 development DB の 構造 を test DB に反映させる $ bundle exec rake db:test:prepare
  • 22. 6.2.3 Format Validation email 等のバリデーション用正規表現 Rubular(http://rubular.com/) 正規表現の入力  ->マッチするか確認
  • 23. 6.2.3 Format Validation 余談 (Gmail の場合 ) 例えば… + やスペースなどのメールアドレスに使えない記号もバリデーションで許可必要 test@gmail.com == test+hoge@gmail + から @ 前までが無視される
  • 24. 6.3.1 Debug and Rails Environments Rails の環境 test( テスト用 ) development( 開発用 ) app 以下のコード変更が常に反映される production( 本番環境 ) コード変更反映にはサーバーの再起動必要。こちらのほうが早い http://d.hatena.ne.jp/zariganitosh/20070108/1168246932
  • 25. 6.3.1 Debug and Rails Environments Rails console のデフォルトは development console で以下のメソッドで確認可能 >> Rails.env => “development” >> Rails.env.development? => “true” >> Rails.env.test? => “false”
  • 26. 6.3.1 Debug and Rails Environments 環境を指定して実行出来る Rails を動かすときも環境指定可能 $ rails console test $ rails server --environment production
  • 27. 6.3.1 Debug and Rails Environments production 環境の DB を構築する ちなみに heroku console で試すと、 Heroku は production 環境であることが分かる $ bundle exec rake db:migrate RAILS_ENV=production
  • 28. 目次 Chapter1 Rails 導入からデプロイ Chapter2 デモアプリ (scaffold 使用 ) Chapter3 Web アプリケーション Chapter4 Rails 風 Ruby Chapter5 スタイルを追加する Chapter6 User Model と View その 1 Chapter7 User Model と View その 2
  • 29. ユーザのログイン周り パスワード暗号化 ユーザの個人ページ作成 Gravatar を利用する gem Chapter7 Modeling and Viewing Users, PartⅡ
  • 30. 7.2.2 Some Secure Password Theory ユーザのログイン パスワードハッシュ化して比較
  • 31. 7.2.2 Some Secure Password Theory $ rails console >> require 'digest' >> def secure_hash (string) >> Digest :: SHA2 . hexdigest(string) >> end >> password = &quot;secret&quot; >> encrypted_password = secure_hash(password) “ 2bb80d537b1da3e38bd30361aa85…( 省略 )&quot; >> submitted_password = &quot;secret&quot; >> encrypted_password == secure_hash(submitted_password) => true ?
  • 32. 7.2.2 Some Secure Password Theory rainbow attack ( 事前計算攻撃 / レインボー攻撃 ) http://michisugara-aud.sakura.ne.jp/lectures/lectures_25.html パスワードが類推される可能性がある -> salt ( 今回は現在時刻の文字列 ) を利用する ハッシュ関数 (pass) を ハッシュ関数 ( 時刻 +pass) に
  • 33. 7.2.2 Some Secure Password Theory >> Time . now . utc => Fri Jan 29 18:11:27 UTC 2010 >> password = &quot;secret&quot; => &quot;secret&quot; >> salt = secure_hash( &quot; #{ Time . now . utc } -- #{ password } &quot; ) => &quot;d1a3eb8c9aab32ec19cfda810d2ab351873b5dca4e16e7f57b3c1932113314c8&quot; >> encrypted_password = secure_hash( &quot; #{ salt } -- #{ password } &quot; ) => &quot;69a98a49b7fd103058639be84fb88c19c998c8ad3639cfc5deb458018561c847&quot; ? ※ 明確にするため、ハッシュ化する文字列は” --” で区切られるらしい
  • 34. 7.2.3 Implementing has_password? User モデルに salt フィールド追加する migration の設定 db/migrate/<timestamp>_add_salt_to_users.rb が作成される migration 名 (add_password_to_users) は自由 ※ _to_users にしておくと、自動で User に追加される!便利! $ rails generate migration add_password_to_users encrypted_password:string
  • 35. 作成した migration の実行 7.2.3 Implementing has_password? $ bundle exec rake db:migrate $ bundle exec rake db:test:prepare sqlite> .schema CREATE TABLE &quot;schema_migrations&quot; (&quot;version&quot; varchar(255) NOT NULL); CREATE TABLE &quot;users&quot; (&quot;id&quot; INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, &quot;name&quot; varchar(255), &quot;email&quot; varchar(255), &quot;created_at&quot; datetime, &quot;updated_at&quot; datetime, &quot;salt&quot; varchar(255));
  • 36. 7.3.2 A Name and a Gravatar Gemfile に gravatar_image_tag 追加 Gravatar(http://gravatar.com) を利用する gem <%= gravatar_image_tag ‘email’ %> これだけで、登録された email のアイコンを表示してくれる       ← Gravatar に登録がない場合に表示される
  • 37. 今回のまとめ 5 章では CSS の導入的な話 User モデルの作り方について、 6 ? 7 章だった 全体的にざっくり削った Tutorial ではちゃんとテストする過程がある RSpec のコードも載っていたが割愛 Heroku ? Git も使っている ( 章毎に push している )
  • 38. 次回予告 8 章 Sign Up 新規登録 9 章 Sign In, Sign Outs セッション周り 10 章 Updating, Showing, and Deleting Users うまく行けば、次の次の回で最終回…? ( 全 12 章 )

Editor's Notes

  1. こんな感じで書けます localhost:3000 にアクセスしたときに何を表示させるかということも root :to =&gt; “hoge#huga” で設定できる 色々あるから調べてみてね。 routes.rb 自体にコメントアウトで設定が描かれているから、それを見るのも早いかも
  2. ----- 会議メモ (11/11/09 20:52) ----- annotate は アジャイル開発の…本を書いた人がつくった gem migrate のバージョンが書かれてしまう モデルを変更したバージョンが  全部のモデルが更新がかかる 問題があった。今のバージョンはそれが無いように見えるが、確認する必要あり。