Router, Routes and Templates
This post is part of my series about learning Ember.js with Ruby on Rails.
We have now the basic skeleton to start building an app for my
mom,
today we are going to talk about 3 important concepts in Ember.js: The
Router
, Routes
and Templates
.
Grab the application from where we left last:
$ git clone [email protected]:abuiles/ember-rails-week-1.git
$ git reset --hard week-1
$ bundle install
$ rails s
Go to http://localhost:3000/
and you should see “Welcome to Ember on Rails!”.
Creating the Application Template.
Ember’s equivalent of Ruby on Rails Application layout is called application too.
Create the file app/templates/application.hbs
and put the following content there.
<h1>Hi Ember.js</h1>
{{outlet}}
Refresh your browser and you will see Hi Ember.js
.
{{outlet}} is similar to yield
on the application
template in Ruby on Rails but is not the same, there is also the
word yield
on Ember.js we’ll cover later
Let’s add something into the outlet, create the file
app/templates/index.hbs
with the following
<h1>I'm the Index!</h1>
Refresh your browser and you will see “Hi Ember.js” follow by “I’m the Index”.
Under the hood.
To understand why the previous stuff worked without requiring us to
add any extra code we’ll have to talk about the concept of Routes
.
In Ember.js there is a Router
and many Routes
.
Router
is where we specify the entry points for our application,
this is similar to routes.rb
.
In Rails router.rb
every entry matches to an action
in a
controller, this is not the case in Ember.js, we mentioned previously
that a controller
in Ember acts more as decorators for our views.
In Ember every entry in the Router
matches to a Route
, if we have
in the router.es6
an entry like:
this.route("about", { path: "/about" });
Then it will look for app/routes/about.es6
and the template app/templates/about.hbs
.
If Ember doesn’t find the route
it will create one automatically and
if we need to do any kind of processing before showing our template
like fetch data from a server or render a different template, then we
can do that on the route
file.
With this in mind, the reason why putting index.hbs
works without
doing anything extra is that Ember.js creates by default an
IndexRoute
, which matches to /
.
When we visit /
, it tries to find app/routes/index.es6
, if it is not there it
creates one by default and then renders the template under templates/index.hbs
.
A first Route
Let’s create a simple route for index
, put the following under /app/routes/index.es6
.
export default Ember.Route.extend({
model: function() {
return { date: Date() };
}
});
Replace the index
template with
<h1>I'm the Index! {{date}}</h1>
After refreshing you will see I'm the Index
follow by a date, we
just write our first route, bootstrapped the required stuff for our
template and then rendered it into the template!
Task
We want to have an /about
page, add the necessary entry to the
Router
and template.
Resources
I suggest going to the official Ember.js guides and check the section for Routing and Templates.