Skip to content

Instantly share code, notes, and snippets.

@bradoyler
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bradoyler/9541200 to your computer and use it in GitHub Desktop.
Save bradoyler/9541200 to your computer and use it in GitHub Desktop.
example routes and controllers
App.Router.map(function() {
this.route("news", {
path: "/news"
}), this.route("entertainment", {
path: "/entertainment"
}), this.route("fashionBeauty", {
path: "/fashion-beauty"
}), this.route("lifestyle", {
path: "/lifestyle"
}), this.route("books", {
path: "/books"
}), this.resource("embeddedSlideshow", {
path: "/articles/:embeddedSlug"
}, function() {
this.route("slide", {
path: "/:slideNumber"
})
}), this.resource("articles", {
path: "/articles/:slug"
}, function() {
this.route("slideshow", {
path: "/:slideNumber"
}), this.route("image", {
path: "/image/:attachmentId"
})
}), this.route("explore", {
path: "/explore"
}), this.route("exploreSubject", {
path: "/explore/:slug"
}), this.route("authors", {
path: "/authors/:slug"
}), this.route("terms", {
path: "/tos"
}), this.route("privacy", {
path: "/privacy"
}), this.route("contact", {
path: "/contact"
}), this.route("dmca", {
path: "/dmca"
}), this.route("about", {
path: "/about"
}), this.route("errorPage", {
path: "/*path"
})
}), App.Route = Ember.Route.extend(Ember.RouteMeta, {
returnToTop: function() {
this.router.sequence > 0 && Ember.run.scheduleOnce("afterRender", this, function() {
window.scrollTo(0, 0)
})
},
fetchPreloadedModelForClass: function(e) {
var t = App.get("preloadedPageModel");
return e && e.detectInstance(t) ? (App.set("preloadedPageModel", null), t) : null
},
onMetaRendered: function() {
App.Analytics.tracker.trackMeta(null)
}
}), App.ApplicationRoute = Ember.Route.extend({
actions: {
loading: function() {
this.controllerFor("application").set("isPageLoading", !0), this.router.one("didTransition", this, function() {
this.controllerFor("application").set("isPageLoading", !1)
})
},
error: function(e, t) {
if (e && 0 !== e.status) {
var n = this.router.router.recognizer.generate(t.targetName);
n && (e.intendedPath = n.substring(1)), this.transitionTo("errorPage", e)
}
},
openSearch: function() {
this.render("searchLightbox", {
into: "application",
outlet: "lightbox",
controller: "search"
}), App.Analytics.tracker.trackPageView("/search")
},
closeSearch: function() {
this.disconnectOutlet({
outlet: "lightbox",
parentView: "application"
})
},
trackPaginatedPageView: function(e) {
App.Analytics.tracker.trackPageView(this.get("router.url").replace(/\/$/, "") + "/page/" + e)
}
}
}), App.IndexRoute = App.Route.extend(Ember.CachedRoute, {
controllerName: "homePage",
titlePath: null,
model: function(e, t) {
return this.getCachedModelForTransition(t) || this.fetchPreloadedModelForClass(App.Section) || App.Section.fetch("home")
},
setupController: function(e, t) {
e.set("content", t), this.controllerFor("carousel").set("content", e.get("carouselContent"))
},
renderTemplate: function() {
this.render("home"), this.render("carousel", {
into: "home",
outlet: "carousel",
controller: "carousel"
}), this.isUsingCachedModel || this.returnToTop()
},
onMetaRendered: function(e, t) {
App.Analytics.tracker.trackMeta({
sections: e.get("title")
}), window.MetaManager.setSocialMediaTags({
twitter: {
"twitter:card": "summary"
},
openGraph: {
"og:description": t.description
}
})
}
}),
App.SectionPageController = Ember.Controller.extend(App.PaginatedContentController, {
featuredContentPart1Count: 4,
showcaseContent: function() {
var e, t, n = this.get("content.modules");
return n && (e = n.filterProperty("position", "showcase"), e && e.objectAt(0) && (t = e.objectAt(0).get("objects"))) ? t.slice(0, 2) : null
}.property("content.modules.@each"),
sidebarModules: function() {
var e = this.get("content.modules");
return e ? e.filterProperty("position", "sidebar") : null
}.property("content.modules.@each"),
featuredContentModule: function() {
var e, t = this.get("content.modules");
return t && (e = t.filterProperty("position", "featured")) ? e.objectAt(0) : null
}.property("content.modules.@each"),
featuredContentModuleId: Ember.computed.alias("featuredContentModule.title"),
featuredContent: Ember.computed.alias("featuredContentModule.objects"),
featuredContentPart1: function() {
var e = this.get("featuredContent");
return e ? e.slice(0, this.get("featuredContentPart1Count")) : null
}.property("featuredContent"),
featuredContentPart2: function() {
var e = this.get("featuredContent");
return e ? e.slice(this.get("featuredContentPart1Count")) : null
}.property("featuredContent.length"),
perPage: 24,
maxPages: 10,
setupPaginationOnInitialContent: function(e, t) {
var n, r = e.get(t);
r && (n = r.get("pagination"), n || r.set("pagination", App.Pagination.create({
pageCount: this.get("featuredContentModule.meta.pagination.page_count") || 1
})))
}.observes("content"),
fetchPageMethod: function() {
var e = this.get("content.slug"),
t = {
exclude_section: e,
page: this.get("nextPage"),
per_page: this.get("perPage"),
state: App.Article.states.PUBLISHED
};
"home" !== e && (t.category = App.Category.getBySlug(e).get("id")), App.Article.fetch(t).then(this.onFetchPageSuccess.bind(this), this.onFetchPageError.bind(this))
},
onFetchPageSuccess: function(e) {
this._super.apply(this, arguments), e && this.get("featuredContent").addObjects(e)
}
}),
///-------------
// Example -----
///-------------
App.SectionPageRoute = App.Route.extend(Ember.CachedRoute, {
category: null,
controllerName: "sectionPage",
model: function(controller, model) {
return this.getCachedModelForTransition(model) || this.fetchPreloadedModelForClass(App.Section) || App.Section.fetch(this.category.get("slug"))
},
setupController: function(controller, model) {
controller.setProperties({
content: model,
category: this.category
})
},
renderTemplate: function() {
this.render("section"), this.isUsingCachedModel || this.returnToTop()
},
onMetaRendered: function(controller, model) {
App.Analytics.tracker.trackMeta({
sections: controller.get("title")
}), window.MetaManager.setSocialMediaTags({
twitter: {
"twitter:card": "summary"
},
openGraph: {
"og:title": model.title,
"og:description": model.description
}
})
}
}),
////////////
App.NewsRoute = App.SectionPageRoute.extend({
category: App.Category.categories[0],
title: App.Category.categories[0].title
}),
///////
App.EntertainmentRoute = App.SectionPageRoute.extend({
category: App.Category.categories[1],
title: App.Category.categories[1].title
}), App.FashionBeautyRoute = App.SectionPageRoute.extend({
category: App.Category.categories[2],
title: App.Category.categories[2].title
}), App.LifestyleRoute = App.SectionPageRoute.extend({
category: App.Category.categories[3],
title: App.Category.categories[3].title
}), App.BooksRoute = App.SectionPageRoute.extend({
category: App.Category.categories[4],
title: App.Category.categories[4].title
}), App.ExploreRoute = App.Route.extend(Ember.CachedRoute, {
title: "Explore",
controllerName: "explorePage",
model: function(e, t) {
return this.getCachedModelForTransition(t) || App.Article.fetch({
per_page: 24,
state: App.Article.states.PUBLISHED
})
},
setupController: function(e, t) {
e.setProperties({
content: t,
category: null,
tag: null
})
},
renderTemplate: function() {
this.render("explorePage"), this.isUsingCachedModel || this.returnToTop()
}
}), App.ExploreSubjectRoute = App.ExploreRoute.extend({
category: null,
tag: null,
title: Ember.computed(function() {
var e = this.get("category.title"),
t = this.get("tag.name"),
n = "Explore ";
return e ? n += e : t && (n += "'" + Ember.String.capitalize(t) + "'"), n
}).property("category", "tag"),
beforeModel: function(e) {
this.set("category", App.Category.getBySlug(e.params.slug) || null)
},
model: function(e, t) {
var n = this.getCachedModelForTransition(t),
r = this.get("category"),
i = this;
return n ? n : r ? App.Article.fetch({
per_page: 24,
category: r.get("id"),
state: App.Article.states.PUBLISHED
}) : App.Tag.fetch(e.slug).then(function(e) {
return i.set("tag", e), App.Article.fetch({
per_page: 24,
tag: e.get("slug"),
state: App.Article.states.PUBLISHED
})
})
},
setupController: function(e, t) {
var n = this.get("category"),
r = this.get("tag");
e.setProperties({
content: t,
category: n ? n : null,
tag: r ? r : null
})
},
renderTemplate: function() {
var e = this.get("category") ? "exploreCategoryPage" : "exploreTagPage";
this.render(e), this.isUsingCachedModel || this.returnToTop()
},
actions: {
error: function(e) {
404 === e.status && this.transitionTo("errorPage", {
status: 404,
errorThrown: "Not Found"
})
}
}
}), App.ArticlesRoute = App.Route.extend(Ember.CachedRoute, {
controllerName: "articlePage",
descriptionPath: "body",
serialize: function(e) {
return e ? {
slug: e.get("slug")
} : null
},
model: function(e, t) {
var n = this.getCachedModelForTransition(t, e);
if (n) return n;
var r = this.fetchPreloadedModelForClass(App.Article);
if (r) return r;
if (e && e.slug) {
var i = parseInt(e.slug, 10);
if (!isNaN(i)) return App.Article.fetch(i)
}
this.replaceWith("errorPage", {
status: 404,
errorThrown: "Not Found"
})
},
setupController: function(e, t) {
e.set("content", t), e.sideloadArticle()
},
renderTemplate: function() {
this.render("articlePage"), this.isUsingCachedModel || this.returnToTop()
},
onMetaRendered: function(e, t) {
if (t.title && t.description || t.title && !t.description) {
App.Analytics.tracker.trackMeta({
authors: e.get("author.name"),
sections: e.get("categoryName"),
date: e.get("publishedAt"),
tags: e.get("tags").map(function(e) {
return e.get("name")
})
});
var n = App.ImageView.addParams(e.get("mediaUrl"), App.ImageView.presets.shareArticle),
r = e.get("author.twitter");
window.MetaManager.setSocialMediaTags({
twitter: {
"twitter:card": "summary_large_image",
"twitter:creator": r ? "@" + r : null,
"twitter:app:url:iphone": e.get("iOSAppUrl")
},
openGraph: {
"og:type": "article",
"og:title": e.get("title"),
"og:image": n
}
})
}
t.description && window.MetaManager.addOpenGraphTags({
"og:description": t.description
})
},
actions: {
openImageLightbox: function(e) {
e && this.transitionTo("articles.image", e)
},
updateRouteOnLightboxClose: function() {
this.disconnectOutlet({
outlet: "lightbox",
parentView: "application"
}), this.router.sequence <= 1 ? this.replaceWith("articles") : history.back()
}
}
}), App.ArticlesIndexRoute = App.Route.extend({
controllerName: "articlePage"
}), App.ArticlesSlideshowRoute = App.Route.extend({
slide: null,
controllerName: "slideshow",
descriptionPath: "body",
model: function(e) {
var t = parseInt(e.slideNumber, 10) || 1,
n = this.modelFor("articles");
if (this.controllerFor("slideshow").set("slideNumber", t), !n || !n.get("isFullyLoaded")) return this.controllerFor("slideshow").sideloadArticle();
var r = n.get("slides").objectAt(t - 1);
return r ? (this.set("slide", r), n) : (this.replaceWith("articles"), void 0)
},
renderTemplate: function() {
this.render("slideshowPage", {
into: "application",
outlet: "lightbox"
})
},
onMetaRendered: function(e, t) {
var n = App.ImageView.addParams(e.get("mediaUrl"), App.ImageView.presets.shareImage),
r = this.modelFor("articles"),
i = r.get("author.twitter"),
s = this.get("slide.title") + " | " + e.get("title");
App.Analytics.tracker.trackMeta({
authors: e.get("author.name"),
sections: e.get("categoryName"),
date: e.get("publishedAt"),
tags: e.get("tags").map(function(e) {
return e.get("name")
}),
landingUrl: location.protocol + "//" + location.hostname + this.get("router").generate("articles.index")
}), window.MetaManager.setTitleAndDescription(s, this.get("slide.body")), window.MetaManager.setSocialMediaTags({
twitter: {
"twitter:card": "photo",
"twitter:creator": i ? "@" + i : null,
"twitter:app:url:iphone": r.get("iOSAppUrl")
},
openGraph: {
"og:type": "article",
"og:title": e.get("title"),
"og:description": t.description,
"og:image": n
}
})
},
deactivate: function() {
App.SlideshowPageView.closeViaRouter(), this.controllerFor("slideshow").reset()
},
actions: {
gotoSlide: function(e) {
this.replaceWith(this.routeName, e)
}
}
}), App.EmbeddedSlideshowRoute = App.ArticlesSlideshowRoute.extend({
afterModel: function(e) {
e.set("primaryCategory", this.modelFor("articles").get("primaryCategory"))
},
serialize: function(e) {
return {
embeddedSlug: e.get("slug")
}
},
renderTemplate: function() {
this.render("articlePage", {
controller: "articlePage"
}), this.render("slideshowPage", {
into: "application",
outlet: "lightbox"
})
},
actions: {
updateRouteOnLightboxClose: function() {
this.disconnectOutlet({
outlet: "lightbox",
parentView: "application"
}), history.back()
}
}
}), App.EmbeddedSlideshowSlideRoute = App.Route.extend({
controllerName: "slideshow",
model: function(e) {
var t = parseInt(e.slideNumber, 10) || 1;
return this.controllerFor("slideshow").set("slideNumber", t), this.modelFor("embeddedSlideshow")
},
actions: {
gotoSlide: function(e) {
this.replaceWith(this.routeName, e)
}
}
}), App.ArticlesImageRoute = App.Route.extend({
controllerName: "imageLightbox",
serialize: function(e) {
if (e) {
var t = e.get("attachmentId");
if (!Ember.isNone(t)) return {
attachmentId: t
}
}
return null
},
model: function(e) {
return this.modelFor("articles"), e && e.attachmentId ? e.attachmentId : (this.replaceWith("articles"), void 0)
},
setupController: function(e, t) {
e.set("attachmentId", t)
},
renderTemplate: function() {
this.render("imageLightbox", {
into: "application",
outlet: "lightbox"
})
},
deactivate: function() {
App.LightboxView.closeViaRouter()
},
onMetaRendered: function() {
var e = "Photo: " + this.modelFor("articles").get("title"),
t = "High-Resolution Image: " + this.modelFor("articles").get("body");
window.MetaManager.setTitleAndDescription(e, t)
},
actions: {
changeImage: function(e) {
this.replaceWith("articles.image", e)
}
}
}), App.AuthorsRoute = App.Route.extend(Ember.CachedRoute, {
controllerName: "authorPage",
titlePath: "name",
descriptionPath: "bio",
serialize: function(e) {
return e ? {
slug: e.get("slug")
} : null
},
model: function(e, t) {
var n = this.getCachedModelForTransition(t, e);
if (n) return n;
var r = this.fetchPreloadedModelForClass(App.Author);
if (r) return r;
if (e && e.slug) {
var i = parseInt(e.slug, 10);
if (!isNaN(i)) return App.Author.fetch(i)
}
this.replaceWith("errorPage", {
status: 404,
errorThrown: "Not Found"
})
},
setupController: function(e, t) {
e.set("content", t), e.sideloadProfile()
},
renderTemplate: function() {
this.render("authorPage"), this.isUsingCachedModel || this.returnToTop()
}
}), App.StaticPageRoute = App.Route.extend(Ember.CachedRoute, {
controllerName: "staticPage",
model: function(e, t) {
return this.getCachedModelForTransition(t) || this.fetchPreloadedModelForClass(App.Page) || App.Page.fetch(this.page.get("slug"))
},
renderTemplate: function() {
this.render("staticPage"), this.isUsingCachedModel || this.returnToTop()
}
}), App.TermsRoute = App.StaticPageRoute.extend({
page: App.Page.staticPages[0],
title: App.Page.staticPages[0].title
}), App.PrivacyRoute = App.StaticPageRoute.extend({
page: App.Page.staticPages[1],
title: App.Page.staticPages[1].title
}), App.ContactRoute = App.StaticPageRoute.extend({
page: App.Page.staticPages[3],
title: App.Page.staticPages[3].title
}), App.DmcaRoute = App.StaticPageRoute.extend({
page: App.Page.staticPages[4],
title: App.Page.staticPages[4].title
}), App.AboutRoute = App.Route.extend({
title: "About",
controllerName: "about",
beforeModel: function() {
return Ember.LazyAssetLoader.load("about", ["//d3sdf3l7p4rfar.cloudfront.net/assets/pods/about-92bd2db2432a75f07f6eb6c5fc2b2294.css", "//d3sdf3l7p4rfar.cloudfront.net/assets/content/pods/about-abc0dca534d8fd43a707afb8b08734d8.js"])
},
model: function() {
return App.AboutPage.find(1)
},
setupController: function(e, t) {
e.set("content", t)
}
}), App.ErrorPageRoute = App.Route.extend({
title: "Error",
serialize: function(e) {
var t = e && e.intendedPath || "";
return {
path: t
}
},
renderTemplate: function() {
this.render("errorPage"), this.returnToTop()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment