Other Pages

Expand All

setting_the_default_page.step

goals {

  message <<-MARKDOWN
  Now that the structure is complete, let's make the flow work smoothly.

  Currently when you go to <http://localhost:3000> you see the "Welcome aboard" message.

  It would be easier to use our app if <http://localhost:3000> went directly to the topics list.

  In this step we'll make that happen and learn a bit about routes in Rails.
  MARKDOWN
}

steps {

  step "Add a root route" do
    message "Open the file `config/routes.rb` in an editor (In the InstallFest yesterday, we suggested that you install and use **Atom** as your editor)."

    message "Look for the line `Rails.application.routes.draw` at the beginning of the file, and add the line `root 'topics#index'` after it. When you are done the start of the file should look like this:"

    source_code :ruby, <<-RUBY
Rails.application.routes.draw do
  root 'topics#index'
    RUBY

    em do
      message "(Rails 3.x users should add `root to: 'topics#index'` and will need to remove their `public/index.html` file)."
    end
  end

  step "Confirm your changes" do
    message "Go back to <http://localhost:3000/>. You should be taken to the topics list automatically."
  end
}

explanation {

 message <<-MARKDOWN
  * `root 'topics#index'` is a Rails route that says the default
    address for your site is `topics#index`. `topics#index` is the topics
    list page (the topics controller with the index action).
  * Rails routes control how URLs (web addresses) get matched with
    code on the server. Similar to how addresses match with houses and
    apartments.
  * The file `config/routes.rb` is like an address directory listing the
    possible addresses and which code goes with each one
  * `routes.rb` uses some shortcuts so it doesn't always show all the
    possible URLs. To explore the URLs in more detail we can use the
    terminal.

  At the terminal type `rails routes`. You should get something that
  looks like this:

  ````
    $ rails routes

        Prefix Verb   URI Pattern                Controller#Action
        topics GET    /topics(.:format)          topics#index
               POST   /topics(.:format)          topics#create
     new_topic GET    /topics/new(.:format)      topics#new
    edit_topic GET    /topics/:id/edit(.:format) topics#edit
         topic GET    /topics/:id(.:format)      topics#show
               PATCH  /topics/:id(.:format)      topics#update
               PUT    /topics/:id(.:format)      topics#update
               DELETE /topics/:id(.:format)      topics#destroy
          root GET    /                          topics#index
  ````
  This shows all the URLs your application responds to. The code that starts with colons are variables so :id means the id number of the record. The code in parenthesis is optional.

  You can also get this information on your site in development. Go to <a href="http://localhost:3000/rails/info">http://localhost:3000/rails/info</a> and you'll see something like this:

  <img src='img/rails4_rails_info_routing.png' alt='Screenshot of browser-based Rails routing info page'>

  You'll also see that table in whenever you try to access an invalid route (try <a href="http://localhost:3000/sandwich">http://localhost:3000/sandwich</a>)

### Exploring Routes (optional)

  Now you can have a look at the paths that are available in your app.
  Let's try looking at one of the topics routes we just generated.
  Open up your Rails console and play:

    $ rails console
    >> app.topics_path
    => "/topics"
    >> app.topics_url
    => "http://www.example.com/topics"

  `app` is a special object that represents your entire application.
  You can ask it about its routes (as we just did), play with its
  database connections, or make pseudo-web requests against it with
  `get` or `post` (and lots more).

  MARKDOWN
}

insert 'consider_deploying'

next_step "voting_on_topics"