# Shared templates across controllers

**URL:** <https://www.ruby-forum.com/t/shared-templates-across-controllers/158232>\
**Category:** Rails\
**Created:** [January 20, 2009, 10:42pm UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232 "2009-01-20T22:42:59Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![adambeazley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/5f9b8f/32.png) [@adambeazley](https://www.ruby-forum.com/u/adambeazley)\
**Post date:** [January 20, 2009, 10:42pm UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232/1 "2009-01-20T22:42:59Z")

</div>

Hey all,

Here’s my situation: I have a pair of controllers with associated  
models (called Services and Testimonials) that are quite similar.  
Because their CRUD behavior is executed via AJAX, the “templates” for  
the actions are all short .rjs files. Now, because of the similarity  
of the models, most of the templates are exactly the same, with only  
the object names changed. That is, where one looks like this:

page.visual\_effect :toggle\_slide, ‘hidden\_testimonial\_form’  
page.visual\_effect :toggle\_slide, ‘add\_testimonial\_button’

The other looks like this:

page.visual\_effect :toggle\_slide, ‘hidden\_service\_form’  
page.visual\_effect :toggle\_slide, ‘add\_service\_button’

Obviously there’s no reason these should be separate. My question is,  
what’s the best way to set these up as shared templates? Both of the  
controllers inherit from a third controller (Brochure) because of  
shared authentication behavior. But the only way I can think of to  
share templates is something like this:

Put template files in /views/brochure.

At the end of each action, explicitly render the template. i.e.

def new  
…  
render :template =\> 'brochure/new  
end

Is there a better way that I’m missing?

---

<div class="post-metadata">

**Author:** ![adambeazley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/5f9b8f/32.png) [@adambeazley](https://www.ruby-forum.com/u/adambeazley)\
**Post date:** [January 20, 2009, 11:04pm UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232/2 "2009-01-20T23:04:16Z")

</div>

I can think of a few things off the top of my head - one way is to  
have one RJS file that looks like this:

page.visual\_effect :toggle\_slide, “hidden\_#{@object}_form"  
page.visual\_effect :toggle\_slide, "add_#{@object}\_testimonial}\_button”

And in each controller action, right before rendering the RJS, do this

@object = “testimonial”

or

@object = “service”

Basically, use instance variables (or another mechanism) to make  
things available to the RJS template just like you would with anything  
else.

Heck if you have @service or @testimonial there, you could generalize  
it more by using the same variable for each - @thing

then do @thing.class.downcase to get “testimonial” or “service”

How does that sound? 🙂

---

<div class="post-metadata">

**Author:** ![adambeazley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/5f9b8f/32.png) [@adambeazley](https://www.ruby-forum.com/u/adambeazley)\
**Post date:** [January 20, 2009, 11:10pm UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232/3 "2009-01-20T23:10:09Z")

</div>

Actually, I got that part pretty well solved by just changing  
everything to “widget.” 🙂

The part I’m wondering is if there’s some way to re-route most of a  
controller to a different set of views than the standard default.  
Right now every action ends with “render :template =\> ‘widget/  
action\_name’” but I’m curious if there’s a better way.

-Adam

---

<div class="post-metadata">

**Author:** ![adambeazley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/5f9b8f/32.png) [@adambeazley](https://www.ruby-forum.com/u/adambeazley)\
**Post date:** [January 20, 2009, 11:26pm UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232/4 "2009-01-20T23:26:05Z")

</div>

Sure. No, there really isn’t. It’s a convenience thing. Not having to  
specify the template is a blessing in most cases. Thing is, you could  
probably do simething interesting with before / after filters.

---

<div class="post-metadata">

**Author:** ![adambeazley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/5f9b8f/32.png) [@adambeazley](https://www.ruby-forum.com/u/adambeazley)\
**Post date:** [January 21, 2009, 6:26am UTC](https://www.ruby-forum.com/t/shared-templates-across-controllers/158232/5 "2009-01-21T06:26:25Z")

</div>

Check out the docs for ActionController::Base#view\_paths. You can  
probably monkey with that to get both controllers to look in the same  
directory.
