# How to make an extendable application

**URL:** <https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887>\
**Category:** Rails\
**Created:** [March 15, 2007, 10:37am UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887 "2007-03-15T10:37:44Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 15, 2007, 10:37am UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887/1 "2007-03-15T10:37:44Z")

</div>

Hey,

This is a question aimed to all who have created their own CMSs.

What is the correct way to go about making a reusable CMS? We all must  
be doing this, creating a new CMS for each site we do is prohibitvely  
expensive.

Going through the Radiant source I see the majority of the code is  
kept in /app. Won’t this make it difficult to update the CMS code once  
it has been interleaved with the rest of the app?

A plugin? What about a seperate set of migrations… we can’t mix the  
CMS migrations and app migrations…

Engines? Seem to be the best solution at the moment… (What I  
currently use)

Thoughts? How does everyone do this?.. or think they should be doing  
it?

ta  
-henry

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 17, 2007, 1:36pm UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887/2 "2007-03-17T13:36:56Z")

</div>

Excellent question - I’m wondering the same thing myself - do you  
write a plugin with a generator that gets you going but then relies  
upon method calls IN the plugin’s library perhaps?

The concept of reusable modules is one very nice feature of Django  
that I like - there’s got to be something similar in Rails!

Wes

On Mar 15, 4:36 am, “removed\_email\_address@domain.invalid”

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 25, 2007, 10:31pm UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887/3 "2007-03-25T22:31:13Z")

</div>

Hi Wes,

I have the answer. The Rails ideology of convention over customisation  
is all well and good until you find an area lacking a convention.  
Engines is the way to go at the moment. I suspect principles will be  
taken from engines and made core eventually, if the poor author of  
Engines finally pursuades everyone they’re plugins and not an engines!

cheers  
-h

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 26, 2007, 10:11pm UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887/4 "2007-03-26T22:11:34Z")

</div>

Thanks for the reply - yeah it looks like the engines guys take a  
beating. 🙂

Wes

On Mar 25, 3:29 pm, “removed\_email\_address@domain.invalid”

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 27, 2007, 12:11am UTC](https://www.ruby-forum.com/t/how-to-make-an-extendable-application/88887/5 "2007-03-27T00:11:16Z")

</div>

All the engines plugin does is make the plugin system a little bit  
more flexible, really. Possibly some parts will be adopted, others  
certainly wont, since it exists to serve a slightly different  
development environment than that of the Rails core team.

This is the nature of open source - we make it work the way that  
serves our needs best 🙂
