diff --git a/packages/ember-routing-htmlbars/lib/helpers/render.js b/packages/ember-routing-htmlbars/lib/helpers/render.js
index 3a9ed2a888b..3174877e820 100644
--- a/packages/ember-routing-htmlbars/lib/helpers/render.js
+++ b/packages/ember-routing-htmlbars/lib/helpers/render.js
@@ -211,6 +211,13 @@ function impersonateAnOutlet(currentView, view, name) {
view._isOutlet = true;
view._outletName = '__ember_orphans__';
view._matchOutletName = name;
+ view._parentOutlet = function() {
+ var parent = this._parentView;
+ while (parent && !parent._isOutlet) {
+ parent = parent._parentView;
+ }
+ return parent;
+ };
view.setOutletState = function(state) {
var ownState;
if (state && (ownState = state.outlets[this._matchOutletName])) {
diff --git a/packages/ember-routing-htmlbars/tests/helpers/render_test.js b/packages/ember-routing-htmlbars/tests/helpers/render_test.js
index 1d687f9c46b..103ede0e829 100644
--- a/packages/ember-routing-htmlbars/tests/helpers/render_test.js
+++ b/packages/ember-routing-htmlbars/tests/helpers/render_test.js
@@ -82,6 +82,23 @@ QUnit.test("{{render}} helper should render given template", function() {
ok(container.lookup('router:main')._lookupActiveView('home'), 'should register home as active view');
});
+QUnit.test("{{render}} helper should render nested helpers", function() {
+ var template = "
HI
{{render 'foo'}}";
+ var controller = EmberController.extend({ container: container });
+ view = EmberView.create({
+ controller: controller.create(),
+ template: compile(template)
+ });
+
+ Ember.TEMPLATES['foo'] = compile("FOO
{{render 'bar'}}");
+ Ember.TEMPLATES['bar'] = compile("BAR
{{render 'baz'}}");
+ Ember.TEMPLATES['baz'] = compile("BAZ
");
+
+ runAppend(view);
+
+ equal(view.$().text(), 'HIFOOBARBAZ');
+});
+
QUnit.test("{{render}} helper should have assertion if neither template nor view exists", function() {
var template = "HI
{{render 'oops'}}";
var controller = EmberController.extend({ container: container });
diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js
index b902848c4f3..9eaa993f98d 100644
--- a/packages/ember/tests/routing/basic_test.js
+++ b/packages/ember/tests/routing/basic_test.js
@@ -3850,3 +3850,57 @@ QUnit.test("Can disconnect from the render helper's children", function() {
Ember.run(router, 'send', 'disconnect');
equal(Ember.$('#qunit-fixture .foo .index').text(), '');
});
+
+QUnit.test("Can render({into:...}) nested render helpers", function() {
+ Ember.TEMPLATES.application = compile('{{render "foo"}}');
+ Ember.TEMPLATES.foo = compile('{{render "bar"}}
');
+ Ember.TEMPLATES.bar = compile('{{outlet}}
');
+ Ember.TEMPLATES.index = compile('other');
+ Ember.TEMPLATES.baz = compile('baz');
+
+ App.IndexRoute = Ember.Route.extend({
+ renderTemplate: function() {
+ this.render({ into: 'bar' });
+ },
+ actions: {
+ changeToBaz: function() {
+ this.disconnectOutlet({
+ parentView: 'bar',
+ outlet: 'main'
+ });
+ this.render('baz', { into: 'bar' });
+ }
+ }
+ });
+
+ bootApplication();
+ equal(Ember.$('#qunit-fixture .bar').text(), 'other');
+ Ember.run(router, 'send', 'changeToBaz');
+ equal(Ember.$('#qunit-fixture .bar').text(), 'baz');
+});
+
+QUnit.test("Can disconnect from nested render helpers", function() {
+ Ember.TEMPLATES.application = compile('{{render "foo"}}');
+ Ember.TEMPLATES.foo = compile('{{render "bar"}}
');
+ Ember.TEMPLATES.bar = compile('{{outlet}}
');
+ Ember.TEMPLATES.index = compile('other');
+
+ App.IndexRoute = Ember.Route.extend({
+ renderTemplate: function() {
+ this.render({ into: 'bar' });
+ },
+ actions: {
+ disconnect: function() {
+ this.disconnectOutlet({
+ parentView: 'bar',
+ outlet: 'main'
+ });
+ }
+ }
+ });
+
+ bootApplication();
+ equal(Ember.$('#qunit-fixture .bar').text(), 'other');
+ Ember.run(router, 'send', 'disconnect');
+ equal(Ember.$('#qunit-fixture .bar').text(), '');
+});