Let’s say I wish to display various resources with a common layout consisting of a toolbar and a list. In Rails, I might do something like the following:
application.html.erb
…
<div class="toolbar">{{yield :toolbar}}</div>
<main>{{yield}}</main>
…
users.erb
…
<%= content_for :toolbar do %>
<%= render partial: "toolbar" %>
<% end %>
…
posts.erb
…
<%= content_for :toolbar do %>
<%= render partial: "toolbar" %>
<% end %>
…
users/_toolbar.html.erb
<button>New User</button>
posts/_toolbar.html.erb
<button>New User</button>
In Ember:
router.js
App.Router.map(function() {
this.resource('users');
this.resource('posts');
});
application.hbs
…
<div class="toolbar">{{outlet 'toolbar'}}</div>
<main>{{outlet}}</main>
…
routes/resource.js
App.ResourceRoute = Em.Route.extend({
renderTemplate: function() {
this.render();
this.renderContent('toolbar');
},
renderContent: function(name, options) {
options = Em.$.extend(options, { outlet: name });
try {
this.render(this.get('routeName') + '/' + name, options);
} catch (e) {}
}
});
routes/users.js
App.UsersRoute = App.ResourceRoute.extend();
routes/posts.js
App.PostsRoute = App.ResourceRoute.extend();
templates/users/toolbar.hbs
<button>New User</button>
templates/posts/toolbar.hbs
<button>New Post</button>
Each resource route extends App.ResourceRoute
which renders RESOURCE_NAME/toolbar
into the toolbar
outlet.
(see: http://emberjs.jsbin.com/cujaq/1/edit)
Is this a sensible approach? Could this pattern be improved?