Rails BootcampPhilly.rb     PhillyTechWeek
Mat Schaffer mat@mashion.net   @matschaffer  matschaffer.com
• Chapter 1: Overview and Installation• Chapter 2: Data and Views• Chapter 3: User Stories and Testing• Chapter 4: Hack time
Chapter 1: Overview• Why Rails?• Rails overview• Dealing with Data• Live Console and Testing
Why Rails?
Rails Overview
• Developed for BaseCamp by 37 signals• DSL for web applications
Controller
Controller
ControllerModel
ControllerModel
ControllerModel                View
ControllerModel                View
Convention over Configuration
GET /commentsCommentsController#index views/comments/index.html.erb
GET /comments/4CommentsController#showviews/comments/show.html.erb
GET /comments/4.jsCommentsController#showviews/comments/show.js.erb
Data
More Convention over   Configuration
Super simple•C   reate•R   etreive•U   pdate•D   elete
Comment.create(:author => "mat")INSERT INTO comments(author) VALUES(mat);
Comment.find_by_author("mat")SELECT * FROM commentsWHERE author = mat;
c = Comment.find(1)c.update_attribute(:author, "mat")SELECT * FROM comments WHERE id = 1;UPDATE comments SET author = mat W...
c = Comment.find(1)c.destroySELECT * FROM comments WHERE id = 1;DELETE FROM comments WHERE id = 1;
more data hotness• Schema management• Works the same across databases
rails console• Try out code live• Inspect your data using code
testing• Built into rails• Strong testing culture built into ruby
servicesgithub.comheroku.comengineyard.comRailsHotline.com
Installation
• Mac needs XCode first  http://developer.apple.com/xcode/• Linux or Mac, use RVM bootstrap  http://bit.ly/unixrails• Windo...
Test your installrails new kickballappcd kickballappbundlerails server(open a browser to http://localhost:3000)
Our project:A League Manager
Chapter 2:  Data  Views
Data
class Team• name• (id, created_at, updated_at)
class Location• name• address• (id, created_at, updated_at)
class Game• starts_at• ends_at• location• home_team• away_team• (id, created_at, updated_at)
class Game• starts_at• ends_at                  class Location• location• home_team• away_team• (id, created_at, updated_at)
class Game• starts_at• ends_at                  class Location• location• home_team                       class Team• away...
CODE!http://bit.ly/railsbc-code
Database Migrations• live in db/migrate• ordered• Abstracted SQL column types• includes id and timestamps by default
MORE CODE!
RESTful Routes• GET /locations (show all locations)• GET /locations/3 (show one location)• POST /locations (make a locatio...
Can also be nested• GET /locations/3/games (show games for  one location)
‘public’ folder• For all static files• Rails looks here first• Offers caching options
Views
ERB• Like JSP/ASP/PHP but in ruby• lots of helper functions for forms, etc.• layout → view → partials
VIEW CODE!
ActiveRecord        Associations• 1 to 1 (belongs_to - has_one)• 1 to many (belongs_to - has_many)• many to many (has_many...
Other points• Controllers
Chapter 3:User Stories  Testing
User Stories
(pivotal tracker)
In order to [value]As a [actor]I want [feature]
Players feature?
In order to know who is on a teamAs a league managerI want to see a list of players onthe team page
Feature: Player listings  In order to know who is on a team  As a league manager  I want to see a list of players on the t...
CucumberFeature: Player listings  In order to know who is on a team  As a league manager  I want to see a list of players ...
User Storiesas Integration Tests
Setting up Cucumber1. Add `group :development, :test` to Gemfile2. Add ‘cucumber-rails’, ‘capybara’ and   ‘database_cleaner...
undefined local variable or method `node for  #<Capybara::Driver::RackTest::Node:...>               (NameError)    • Commen...
CODE(setting it up)
Running a scenario1. Put `@wip` above the scenario2. Run `rake cucumber:wip`
CODE(running it)
Debugging`Then show me the page`requires ‘launchy’ gem`Then debug` (debugger;1)requires ‘ruby-debug’ or ‘ruby-debug19’
CODE(debugging it)
Building data
`$EDITOR features/support/fixtures.rb`Before do  Team.create(:name => "Ballshevicks")end
• Any features/support/*.rb gets loaded• `Before` gets run before each Scenario
Other Data Options• Load test/fixtures/*.yml• Use the ‘fabrication’ object factory gem
CODE(giving it data)
Defining Steps          When I follow "Show" in the row with "Ballshevicks"When /^I follow "([^"]*)" in the row with "([^"]...
Defining Steps          When I follow "Show" in the row with "Ballshevicks" Regular ExpressionWhen /^I follow "([^"]*)" in ...
Defining Steps          When I follow "Show" in the row with "Ballshevicks" Regular Expression                             ...
Defining Steps          When I follow "Show" in the row with "Ballshevicks" Regular Expression                             ...
web_steps.rbGiven I am on the (rake routes) pageWhen I press “button” / follow “link”When I fill in “field” with “value”When...
CODE(assigning teams?)
Unit testing
Use for direct testing of• Models (test/unit/*.rb)• Helpers (test/unit/helpers/*.rb)• Controllers (test/functional/*.rb)
Example:          Player#last_nameclass PlayerTest < ActiveSupport::TestCase  test "parses out last name" do    trotter = ...
CODE(run and fix it)
Chapter 4:  Do it!
PTW Rails Bootcamp
PTW Rails Bootcamp
Upcoming SlideShare
Loading in …5
×

PTW Rails Bootcamp

589
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
589
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • What are you interested/concerned about?\n- jobs\n- community involvement\n- notoriety\n- easy\n- fun\n
  • - Cake PHP, Symphony?\n- Spring Roo, MVC?\n- Django?\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Or no database. Use sqlite to get even your designers up and running quickly.\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • PTW Rails Bootcamp

    1. 1. Rails BootcampPhilly.rb PhillyTechWeek
    2. 2. Mat Schaffer mat@mashion.net @matschaffer matschaffer.com
    3. 3. • Chapter 1: Overview and Installation• Chapter 2: Data and Views• Chapter 3: User Stories and Testing• Chapter 4: Hack time
    4. 4. Chapter 1: Overview• Why Rails?• Rails overview• Dealing with Data• Live Console and Testing
    5. 5. Why Rails?
    6. 6. Rails Overview
    7. 7. • Developed for BaseCamp by 37 signals• DSL for web applications
    8. 8. Controller
    9. 9. Controller
    10. 10. ControllerModel
    11. 11. ControllerModel
    12. 12. ControllerModel View
    13. 13. ControllerModel View
    14. 14. Convention over Configuration
    15. 15. GET /commentsCommentsController#index views/comments/index.html.erb
    16. 16. GET /comments/4CommentsController#showviews/comments/show.html.erb
    17. 17. GET /comments/4.jsCommentsController#showviews/comments/show.js.erb
    18. 18. Data
    19. 19. More Convention over Configuration
    20. 20. Super simple•C reate•R etreive•U pdate•D elete
    21. 21. Comment.create(:author => "mat")INSERT INTO comments(author) VALUES(mat);
    22. 22. Comment.find_by_author("mat")SELECT * FROM commentsWHERE author = mat;
    23. 23. c = Comment.find(1)c.update_attribute(:author, "mat")SELECT * FROM comments WHERE id = 1;UPDATE comments SET author = mat WHEREid = 1;
    24. 24. c = Comment.find(1)c.destroySELECT * FROM comments WHERE id = 1;DELETE FROM comments WHERE id = 1;
    25. 25. more data hotness• Schema management• Works the same across databases
    26. 26. rails console• Try out code live• Inspect your data using code
    27. 27. testing• Built into rails• Strong testing culture built into ruby
    28. 28. servicesgithub.comheroku.comengineyard.comRailsHotline.com
    29. 29. Installation
    30. 30. • Mac needs XCode first http://developer.apple.com/xcode/• Linux or Mac, use RVM bootstrap http://bit.ly/unixrails• Windows http://railsinstaller.org• Ubuntu on VirtualBox is fun too
    31. 31. Test your installrails new kickballappcd kickballappbundlerails server(open a browser to http://localhost:3000)
    32. 32. Our project:A League Manager
    33. 33. Chapter 2: Data Views
    34. 34. Data
    35. 35. class Team• name• (id, created_at, updated_at)
    36. 36. class Location• name• address• (id, created_at, updated_at)
    37. 37. class Game• starts_at• ends_at• location• home_team• away_team• (id, created_at, updated_at)
    38. 38. class Game• starts_at• ends_at class Location• location• home_team• away_team• (id, created_at, updated_at)
    39. 39. class Game• starts_at• ends_at class Location• location• home_team class Team• away_team• (id, created_at, updated_at)
    40. 40. CODE!http://bit.ly/railsbc-code
    41. 41. Database Migrations• live in db/migrate• ordered• Abstracted SQL column types• includes id and timestamps by default
    42. 42. MORE CODE!
    43. 43. RESTful Routes• GET /locations (show all locations)• GET /locations/3 (show one location)• POST /locations (make a location)• PUT /locations/3 (update one location)
    44. 44. Can also be nested• GET /locations/3/games (show games for one location)
    45. 45. ‘public’ folder• For all static files• Rails looks here first• Offers caching options
    46. 46. Views
    47. 47. ERB• Like JSP/ASP/PHP but in ruby• lots of helper functions for forms, etc.• layout → view → partials
    48. 48. VIEW CODE!
    49. 49. ActiveRecord Associations• 1 to 1 (belongs_to - has_one)• 1 to many (belongs_to - has_many)• many to many (has_many :through)
    50. 50. Other points• Controllers
    51. 51. Chapter 3:User Stories Testing
    52. 52. User Stories
    53. 53. (pivotal tracker)
    54. 54. In order to [value]As a [actor]I want [feature]
    55. 55. Players feature?
    56. 56. In order to know who is on a teamAs a league managerI want to see a list of players onthe team page
    57. 57. Feature: Player listings In order to know who is on a team As a league manager I want to see a list of players on the team page Scenario: listing on a team page Given I am on the teams page When I follow "Ballshevicks" Then I should see "Trotter"
    58. 58. CucumberFeature: Player listings In order to know who is on a team As a league manager I want to see a list of players on the team page Scenario: listing on a team page Given I am on the teams page When I follow "Ballshevicks" Then I should see "Trotter"
    59. 59. User Storiesas Integration Tests
    60. 60. Setting up Cucumber1. Add `group :development, :test` to Gemfile2. Add ‘cucumber-rails’, ‘capybara’ and ‘database_cleaner’ in that group3. Run `bundle`4. Run `rails generate cucumber:install`5. `$EDITOR features/players.feature`
    61. 61. undefined local variable or method `node for #<Capybara::Driver::RackTest::Node:...> (NameError) • Comment out line 18 in features/ support/env.rb • cucumber-rails 0.4.0 fixes this, but it’s still in beta
    62. 62. CODE(setting it up)
    63. 63. Running a scenario1. Put `@wip` above the scenario2. Run `rake cucumber:wip`
    64. 64. CODE(running it)
    65. 65. Debugging`Then show me the page`requires ‘launchy’ gem`Then debug` (debugger;1)requires ‘ruby-debug’ or ‘ruby-debug19’
    66. 66. CODE(debugging it)
    67. 67. Building data
    68. 68. `$EDITOR features/support/fixtures.rb`Before do  Team.create(:name => "Ballshevicks")end
    69. 69. • Any features/support/*.rb gets loaded• `Before` gets run before each Scenario
    70. 70. Other Data Options• Load test/fixtures/*.yml• Use the ‘fabrication’ object factory gem
    71. 71. CODE(giving it data)
    72. 72. Defining Steps When I follow "Show" in the row with "Ballshevicks"When /^I follow "([^"]*)" in the row with "([^"]*)"$/ do |link, text|  When %Q|I follow "#{link}" within "tr:contains(#{text})"|end features/step_definitions/table_steps.rb
    73. 73. Defining Steps When I follow "Show" in the row with "Ballshevicks" Regular ExpressionWhen /^I follow "([^"]*)" in the row with "([^"]*)"$/ do |link, text|  When %Q|I follow "#{link}" within "tr:contains(#{text})"|end features/step_definitions/table_steps.rb
    74. 74. Defining Steps When I follow "Show" in the row with "Ballshevicks" Regular Expression Capturing groupsWhen /^I follow "([^"]*)" in the row with "([^"]*)"$/ do |link, text|  When %Q|I follow "#{link}" within "tr:contains(#{text})"|end features/step_definitions/table_steps.rb
    75. 75. Defining Steps When I follow "Show" in the row with "Ballshevicks" Regular Expression Capturing groupsWhen /^I follow "([^"]*)" in the row with "([^"]*)"$/ do |link, text|  When %Q|I follow "#{link}" within "tr:contains(#{text})"|end features/step_definitions/table_steps.rb Definition in ruby code
    76. 76. web_steps.rbGiven I am on the (rake routes) pageWhen I press “button” / follow “link”When I fill in “field” with “value”When I select “option” from “field”When I check “field”Then I should see “text” (within “section”)
    77. 77. CODE(assigning teams?)
    78. 78. Unit testing
    79. 79. Use for direct testing of• Models (test/unit/*.rb)• Helpers (test/unit/helpers/*.rb)• Controllers (test/functional/*.rb)
    80. 80. Example: Player#last_nameclass PlayerTest < ActiveSupport::TestCase  test "parses out last name" do    trotter = Player.new(:name => "Trotter Cashion")    assert_equal "Cashion", trotter.last_name  endend (Test First! At least try.)
    81. 81. CODE(run and fix it)
    82. 82. Chapter 4: Do it!

    ×