Ruby on Rails Tutorial Chapter8-10

1,722 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,722
On SlideShare
0
From Embeds
0
Number of Embeds
259
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • どのようにテストを書くのか ユーザを作成できないとき、 new ページを表示するとき等のテストが書かれている
  • ここでテストツールの話
  • authenticate は渡された値のユーザが存在したときそのユーザ自身を返して、無かったときは nil を返すメソッドとして、 app/models/user.rb に定義されている
  • Ruby on Rails Tutorial Chapter8-10

    1. 1. RUBY ON RAILS 3 Tutorial を日本語訳してみた Chapter 8-10 2011/12/07
    2. 2. Ruby on Rails Tutorial とは <ul><li>前に LT したときに紹介したサイト </li></ul><ul><ul><li>http://ruby.railstutorial.org/ruby-on-rails-tutorial-book </li></ul></ul>
    3. 3. 前回のおさらい <ul><li>ユーザのログイン部分の実装の話等々 </li></ul><ul><ul><li>パスワード+時間をハッシュ化して保存 </li></ul></ul><ul><li>Twitter もどきを実装途中 </li></ul>
    4. 4. 目次 <ul><li>Chapter1 Rails 導入からデプロイ </li></ul><ul><li>Chapter2 デモアプリ (scaffold 使用 ) </li></ul><ul><li>Chapter3 Web アプリケーション </li></ul><ul><li>Chapter4 Rails 風 Ruby </li></ul><ul><li>Chapter5 スタイルを追加する </li></ul><ul><li>Chapter6 User Model と View その 1 </li></ul><ul><li>Chapter7 User Model と View その 2 </li></ul>
    5. 5. 目次 <ul><li>Chapter8 ユーザ登録 </li></ul><ul><li>Chapter9 ログイン・ログアウト </li></ul><ul><li>Chapter10 ユーザデータの更新・編集・追加 </li></ul><ul><li>Chapter11 ミニブログ ( ツイート ) </li></ul><ul><li>Chapter12 ユーザのフォロー </li></ul>
    6. 6. Chapter8 Sign up <ul><li>form_for の使いかた </li></ul><ul><li>RSpec を使ったテストの書き方 </li></ul><ul><ul><li>スライドに載せるには長いので割愛 </li></ul></ul>
    7. 7. Chapter8 Sign up <ul><li>一旦 DB をリセット </li></ul>$ bundle exec rake db:reset
    8. 8. 8.1.1 Using form_for <ul><li>form_for 使いかた </li></ul><%=   form_for ( @user )  do  | f |   %>    < div  class= &quot;field&quot; >      <%=   f. label   :name   %> < br  />      <%=   f. text_field   :name   %>     </ div >     < div  class= &quot;actions&quot; >      <%=   f.submit  &quot; Sign up &quot;   %>     </ div > <%   end %>  
    9. 9. 8.1.1 Using form_for <ul><li>controller 側で @user = User.new 必要 </li></ul><ul><li>f.label や f.text_field のように使う </li></ul><ul><li>Rails2.x -> <% form_for …%> </li></ul><ul><li>Rails3.x -> <% = form_for …%> </li></ul>
    10. 10. 言い忘れ @Chap4 <ul><li>BluePrint(http://blueprintcss.org/) </li></ul><ul><ul><li>CSS フレームワーク </li></ul></ul><ul><ul><li>Tutorial ではこれを利用+ CSS 追加 </li></ul></ul>
    11. 11. 言い忘れ @Chap4 <ul><li>BluePrint 導入 </li></ul><ul><li>http://blueprintcss.org/ から DL </li></ul><ul><li>DL ファイルの blueprint フォルダを app/assets/stylesheet 以下にコピー </li></ul><ul><li>app/views/layouts/application.html.erb に追加 </li></ul><%=   stylesheet_link_tag   ' blueprint/screen ' ,  :media  =>  ' screen '   %> <%=   stylesheet_link_tag   ' blueprint/print ' ,   :media  =>  ' print '   %>  
    12. 12. 8.1.1 Using form_for <ul><li>BluePrint+CSS 追加、 form 完成後の状態 </li></ul>http://ruby.railstutorial.org/chapters/sign-up#top
    13. 13. 8.2.1 Testing Failure <ul><li>users_controller_spec.rb は Tutorial 参照 </li></ul>
    14. 14. 8.2.3 Signup Error Messages <ul><li>errors.full_messages </li></ul><ul><ul><li>これを利用して、エラー画面を出せる </li></ul></ul>$ rails console >> user = User.new(… 省略… , :email => “invalid”) >> user.save => false >> user.errors.full_messages => [“Email is invalid”]
    15. 15. Box8.1 Integration alternatives <ul><li>この Tutorial では RSpec を利用 </li></ul><ul><li>Rails 標準の Test::Unit という手段もある </li></ul><ul><ul><li>1 プロジェクトに RSpec か Test::Unit を選ぶ。混ぜない </li></ul></ul>
    16. 16. Box8.1 Integration alternatives <ul><li>Cucumber という手段 :RSpec と使える </li></ul><ul><li>クライアント側のテストに有効 </li></ul><ul><li>Cucumber を学ぶのおすすめ! </li></ul>
    17. 17. 8.4.1 Integration Tests with Style <ul><li>spec ファイル作成 </li></ul><ul><li>signin に失敗 / 成功用のテスト </li></ul><ul><ul><li>Tutorial 参照 </li></ul></ul><ul><ul><ul><li>visit signin_path や fill_in “name”, :with => “unagi” </li></ul></ul></ul>$ rake generage integration_test users
    18. 18. 目次 <ul><li>Chapter8 ユーザ登録 </li></ul><ul><li>Chapter9 ログイン・ログアウト </li></ul><ul><li>Chapter10 ユーザデータの更新・編集・追加 </li></ul><ul><li>Chapter11 ミニブログ ( ツイート ) </li></ul><ul><li>Chapter12 ユーザのフォロー </li></ul>
    19. 19. Chapter9 Sign in, sign out <ul><li>ログインとログアウトの実装 </li></ul>
    20. 20. 9.1.1 Sessions controller <ul><li>config/routes.rb に追加 </li></ul>SampleApp :: Application .routes.draw  do    resources   :users    resources   :sessions ,  :only  => [ :new ,  :create ,  :destroy ]    match   ' /signup ' ,   :to  =>  ' users#new '    match   ' /signin ' ,   :to  =>  ' sessions#new '    match   ' /signout ' ,  :to  =>  ' sessions#destroy ’ # 省略 end  
    21. 21. 9.1.1 Sessions controller <ul><li>セッション管理 </li></ul>HTTP リクエスト URL ルート名 Action 目的 GET /signin signin_path new ログイン画面 POST /sessions sessions_path create 新規セッション発行 DELETE /signout signout_path destroy セッション削除 ( ログアウト )
    22. 22. 9.1.2 Signin form <ul><li>ログインフォーム作成 </li></ul><%=   form_for ( :session ,  :url  => sessions_path)  do  | f |   %>    < div  class= &quot;field&quot; >      <%=   f. label   :email   %> < br  />      <%=   f. text_field   :email   %>    </ div >    < div  class= &quot;field&quot; >      <%=   f. label   :password   %> < br  />      <%=   f. password_field   :password   %>    </ div >    < div  class= &quot;actions&quot; >      <%=   f.submit  &quot; Sign in &quot;   %>    </ div > <%   end   %>  
    23. 23. 9.2.2 Failed signin(test and code) <ul><li>SessionsController の create 作成 </li></ul>   def   create     user =  User .authenticate( params [ :session ][ :email ],                               params [ :session ][ :password ])      if  user.nil?        flash .now[ :error ] =  &quot; Invalid email/password combination. &quot;        @title  =  &quot; Sign in &quot;        render   ' new '      else        # Sign the user in and redirect to the user's show page.      end    end  
    24. 24. 9.2.2 Failed signin(test and code) <ul><li>authenticate() は User モデルに定義済み </li></ul><ul><ul><li>認証失敗なら nil 、成功ならその user を返す </li></ul></ul><ul><li>flash[:error] にエラーメッセージを追加 </li></ul>
    25. 25. Box 9.1 Flash dot now <ul><li>flash と flash.now の違い </li></ul><ul><ul><li>flash-> リダイレクト先まで有効 </li></ul></ul><ul><ul><ul><li>エラー時に render でエラーを表示させる場合、 render とリダイレクト後の 2 回表示されてしまう </li></ul></ul></ul><ul><ul><li>flash.now->render されたページまで有効 </li></ul></ul><ul><ul><ul><li>今回は、エラー時に render “new” しているので、 flash.now 利用 </li></ul></ul></ul>http://trwtnb.blogspot.com/2009/11/rubyrailsflashnownoticeflashnotice.html
    26. 26. 9.3.2 Remember me <ul><li>まだログイン部分の話 </li></ul><ul><li>SessionsHelper を使いたい </li></ul><ul><ul><li>app/helpers/application_helper.rb に追加 </li></ul></ul><ul><ul><li>helper はデフォルトでは View でのみ利用可なため </li></ul></ul>class   ApplicationController  <  ActionController :: Base    protect_from_forgery    include   SessionsHelper    end
    27. 27. 9.3.3 Current user <ul><li>app/helpers/sessions_helper.rb に追加 </li></ul><ul><ul><li>sign_in, current_user, user_from_remember_token, remember_token </li></ul></ul><ul><ul><li>sessions_helper.rb と User.rb の実装、テストは Tutorial 参照 </li></ul></ul><ul><ul><li>github のリポジトリ </li></ul></ul><ul><ul><li>https://github.com/railstutorial/sample_app </li></ul></ul>
    28. 28. Box 9.4.What the *$@! is ||= ? <ul><li>|| メソッドとは </li></ul><ul><li>nil(false) ではない方を返す。両方 true なら左の値を返す </li></ul><ul><li>hoge =|| huga なら、 hoge が nil/false なら huga を代入 </li></ul>>> 1 || nil => 1 >> 2 || 1 => 2 http://www.ruby-lang.org/ja/old-man/html/Ruby_A4C7BBC8A4EFA4ECA4EBB5ADB9E6A4CEB0D5CCA3.html
    29. 29. Box 9.5. 10 types of people <ul><li>三項演算子 </li></ul><ul><li>true か false ? true なら実行 : false なら実行 </li></ul><ul><li>例: </li></ul>>> a = nil ? &quot;this is true&quot;:&quot;this is false” >> puts a this is false
    30. 30. 9 章まとめ <ul><li>ログイン画面 (form_for の使いかた ) </li></ul><ul><li>セッション実装 </li></ul><ul><ul><li>コードが多いので、だいぶ割愛しました。ぜひ Tutorial or github のリポジトリ ( https://github.com/railstutorial/sample_app ) 参照下さい! </li></ul></ul>
    31. 31. 目次 <ul><li>Chapter8 ユーザ登録 </li></ul><ul><li>Chapter9 ログイン・ログアウト </li></ul><ul><li>Chapter10 ユーザデータの更新・編集・追加 </li></ul><ul><li>Chapter11 ミニブログ ( ツイート ) </li></ul><ul><li>Chapter12 ユーザのフォロー </li></ul>
    32. 32. Chapter10 Updating, showing, and deleting users <ul><li>ユーザ情報の更新・削除 </li></ul><ul><li>Chapter9 と同様、実装とテストコード多め </li></ul><ul><ul><li>今回は gem の紹介のみ </li></ul></ul>
    33. 33. 10.3.2 Sample users <ul><li>サンプルユーザ作成用 gem </li></ul><ul><ul><li>faker(http://faker.rubyforge.org/) </li></ul></ul><ul><li>Gemfile に記述 </li></ul>group  :development   do    gem   ‘ rspec-rails ’    gem   ‘ annotate ’ ,  :git  =>  ‘ git://github.com/ctran/annotate_models.git ’    gem   ‘ faker ’ end a
    34. 34. 10.3.2 Sample users <ul><li>gem のインストール </li></ul>$ bundle
    35. 35. 10.3.2 Sample users <ul><li>lib/tasks/sample_data.rake を作成 </li></ul>namespace   :db   do    desc   &quot; Fill database with sample data &quot;    task   :populate  =>  :environment   do      Rake :: Task [ ' db:reset ' ].invoke      User .create!( :name  =>  &quot; Example User &quot; ,                   :email  =>  &quot; [email_address] &quot; ,                   :password  =>  &quot; foobar &quot; ,                   :password_confirmation  =>  &quot; foobar &quot; )      99 .times  do  | n |       name  =  Faker :: Name .name       email =  &quot; example- #{ n+ 1 } @railstutorial.org &quot;       password  =  &quot; password &quot;        User .create!( :name  => name,                     :email  => email,                     :password  => password,                     :password_confirmation  => password)      end    end end  
    36. 36. 拡大 namespace   :db   do    desc   “ Fill database with sample data ”    task   :populate  =>  :environment   do      Rake :: Task [ ‘ db:reset ’ ].invoke      User .create!( :name  =>  “ Example User ” ,                   :email  =>  “ [email_address] ” ,                   :password  =>  “ foobar ” ,                   :password_confirmation  =>  “ foobar ” )
    37. 37. 拡大      99 .times  do  | n |       name  =  Faker :: Name .name       email =  “ example- #{ n+ 1 } @railstutorial.org ”       password  =  “ password ”        User .create!( :name  => name,                     :email  => email,                     :password  => password,                     :password_confirmation  => password)      end    end end
    38. 38. 10.3.2 Sample users <ul><li>実行 </li></ul>$ bundle exec rake db:populate
    39. 39. 10.3.3 Pagination <ul><li>Gemfile に記述 </li></ul><ul><li>インストール </li></ul>group  :development   do    gem   ‘ rspec-rails ’    gem   ‘ annotate ’ ,  :git  =>  ‘ git://github.com/ctran/annotate_models.git ’    gem   ‘ faker ’   gem   ‘ will_paginate ’ end a $ bundle
    40. 40. 10.3.3 Pagination <ul><li>will_paginate </li></ul><ul><li>(https://github.com/mislav/will_paginate) </li></ul>
    41. 41. 10.3.3 Pagination <ul><li>app/views/users/index.html.erb </li></ul>< ul  class= &quot;users&quot; >    <%   @users .each  do  | user |  %>      < li >      <%=  gravatar_for user,  :size  =>  30   %>      <%=   link_to  user.name, user  %>      </ li >    <%   end   %> </ ul > <%=  will_paginate  %>  
    42. 42. 10.3.3 Pagination <ul><li>app/controllers/users_controller.rb </li></ul>def   index      @title  =  “ All users ”      @users  =  User .paginate( :page  =>  params [ :page ]) end
    43. 43. 10 章まとめ <ul><li>ユーザ情報の更新・削除の実装 </li></ul><ul><ul><li>github リポジトリ参照 </li></ul></ul><ul><li>faker や will_paginate という gem 紹介 </li></ul>
    44. 44. まとめ <ul><li>form_for の使いかた </li></ul><ul><li>CSS フレームワーク BruePrint 紹介 </li></ul><ul><li>will_paginate,faker </li></ul>
    45. 45. 次回予告 <ul><li>10 章の間に合わなかった分、次回にいれるかも </li></ul><ul><li>次回 11 章〜 12 章で最終回! ( のはず ) </li></ul>

    ×