# How to include classes in extensions?

**URL:** <https://www.ruby-forum.com/t/how-to-include-classes-in-extensions/122513>\
**Category:** Radiant CMS\
**Created:** [December 8, 2007, 4:10pm UTC](https://www.ruby-forum.com/t/how-to-include-classes-in-extensions/122513 "2007-12-08T16:10:20Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [December 8, 2007, 4:10pm UTC](https://www.ruby-forum.com/t/how-to-include-classes-in-extensions/122513/1 "2007-12-08T16:10:20Z")

</div>

I decided to spend a little longer coming up with a better solution,  
so went back to the original rails ordinalize method and instead now  
regex the string in place.

I include it here just in case its useful to someone. My knowledge of  
regex is low so I make no claims to its robustness.

```
   start_date = page.start_date
   sdate = start_date.strftime("%A") + " " +

```

start\_date.strftime(“%d”).to\_i.ordinalize + " " +  
start\_date.strftime(“%B”)  
%{ #{sdate.gsub(/(.)(\d+)(st|nd|rd|th)(.)/) {|s| $1 + $2 +  
‘’ + $3 + ‘’ + $4} } }

Thanks for all your help, and special thanks to Sean for the shards  
and schedular extentions which helped me to dive into the code (for  
better or worse!)

[Radiant] How to include classes in extensions?

subsorama at [gmail.com](http://gmail.com) subsorama at [gmail.com](http://gmail.com)  
Fri Dec 7 19:22:24 GMT 2007  
Previous message: [Radiant] How to include classes in extensions?  
Next message: [Radiant] Issues while Installing backdoor  
Messages sorted by: [date] [thread] [subject] [author]  
Many thanks for both your detailed answers, they were indeed very  
helpful. I went ahead with the mixin module as I also wanted the  
ordinals styled with 's. After some thought I should imagine a  
much cleaner way would be by defining a regexp for the date string and  
running that from the tags, but as you can probably tell I’m learning  
as I go. I’m not sure well formed the tags are on the other side but  
it’s seems to be working as I wanted.

For your pleasure:

```
    start_date = page.start_date
    sdate = start_date.strftime("%A") + " " +

```

start\_date.strftime(“%d”).to\_i.ordinalize + " " +  
start\_date.strftime(“%B”)  
sdate

Its probably not the place to ask, but if anyone knows a simple way to  
replace those ordinals in the string using regexp I would be very  
gratefiul!

Thanks once again for your all help,

Dominic

On 7 Dec 2007, at 14:18, Andrew O’Brien wrote:

> Hi Dominic,
> 
> First off, I think what you’re trying to do is already done by a  
> Rails  
> core extension to Integer. See:

[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Integer/Inflections.html](http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Integer/Inflections.html)

> If you still want to do something like this, it needs to be more like  
> (and I haven’t tested this code):
> 
> module Ordinalizable  
> def ordinalize  
> cardinal = self.to\_i.abs  
> if (10…20).include?(cardinal) then  
> cardinal.to\_s \<\< ‘th’  
> else  
> cardinal.to\_s \<\< %w{th st nd rd th th th th th th}[cardinal %  
> 10]  
> end  
> end  
> end
> 
> # Only Integers should be ordinalized
> 
> Integer.send :include, Ordinalizable
> 
> Stick this in your extension’s lib directory and explicitly require  
> it  
> from the extension file.
> 
> Your first example where you monkey-patch Numeric should have worked  
> (depending of course on if the file was loaded), however, like I said  
> above, Floats and most of the other Numerics probably shouldn’t be  
> ordinalized. I think module mixin is generally cleaner from a design  
> standpoint (opinions may vary), though.
> 
> Your second one has a couple of problems, which I point out not out  
> of  
> toolishness, but in the hope that it’s helpful: 😉
> 
> 1. Numeric doesn’t need to inherit from Page. This is only necessary  
> for new Page types, which will appear in the Page Type select box.
> 
> 2. Putting a class inside an extension is often a good way to keep  
> your namespace clean, but you probably shouldn’t do it for anything  
> that inherits from ActiveRecord::Base.
> 
> 3. It looks like what you’ve got is a case of mixed metaphors here:  
> you’re trying to mixin a module to put an instance method into a  
> class, and you’re trying to monkey-patch the class directly. Both  
> are  
> fine on their own (with varying opinions on cleanliness), but neither  
> will work this way.
> 
> 4. You don’t want to include the module into Page. Since ordinalize  
> assumes that self is an Integer, it doesn’t make any sense for it to  
> operate on a Page. If, however, you defined a module with a number  
> of  
> tags (which it sounds like you’re also trying to do elsewhere), that  
> is what you want to do to get the tags into Page.
> 
> Hope this helps,  
> Andrew
> 
> On Dec 7, 2007 7:32 AM, wrote:
> 
> > Hi,
> > 
> > I would like to access this snippet of code from within my extension  
> > tags:
> > 
> > class Numeric  
> > def ordinal  
> > cardinal = self.to\_i.abs  
> > if (10…20).include?(cardinal) then  
> > cardinal.to\_s \<\< ‘th’  
> > else  
> > cardinal.to\_s \<\< %w{th st nd rd th th th th th th}[cardinal %  
> > 10]  
> > end  
> > end  
> > end
> > 
> > As the tags get called on the page I have tried adding the above to:
> > 
> > module StartDate::PageExtensions  
> > class Numeric \< Page
> > 
> > ```
> > def ordinal
> > cardinal = self.to_i.abs
> > if (10...20).include?(cardinal) then
> > cardinal.to_s << 'th'
> > else
> > cardinal.to_s << %w{th st nd rd th th th th th th}
> > 
> > ```

[cardinal %

> > 10]  
> > end  
> > end
> > 
> > end  
> > end
> > 
> > which is called from:
> > 
> > Page.send :include, StartDate::PageExtensions
> > 
> > The tag works fine when I don’t call the new method, but when I do  
> > I’m  
> > getting an “undefined method ‘ordinal’ error”, so I must be defining  
> > it wrong, but how do I do it right?
> > 
> > Any advice?
> > 
> > Thanks,
> > 
> > Dominic
> > 
> > * * *
> > 
> > Radiant mailing list  
> > Post: Radiant at [lists.radiantcms.org](http://lists.radiantcms.org)  
> > Search: [http://radiantcms.org/mailing-list/search/](http://radiantcms.org/mailing-list/search/)  
> > Site: [http://lists.radiantcms.org/mailman/listinfo/radiant](http://lists.radiantcms.org/mailman/listinfo/radiant)
> 
> * * *
> 
> Radiant mailing list  
> Post: Radiant at [lists.radiantcms.org](http://lists.radiantcms.org)  
> Search: [http://radiantcms.org/mailing-list/search/](http://radiantcms.org/mailing-list/search/)  
> Site: [http://lists.radiantcms.org/mailman/listinfo/radiant](http://lists.radiantcms.org/mailman/listinfo/radiant)

Previous message: [Radiant] How to include classes in extensions?  
Next message: [Radiant] Issues while Installing backdoor  
Messages sorted by: [date] [thread] [subject] [author]  
More information about the Radiant mailing list
