mixin's for modules

Perry Smith wrote:

I want to have a module that I mixin to more than one model.

What would be the most "rails like" way to do this?

I put it in a file (my_mixin_module.rb) in /lib and then include it in each model that needs it:

class SomeModel < AR::B   include MyMixinModule end

Works for me. Hope this helps, Chris

Hi --

dblack@wobblini.net wrote:

Hi --

Chris Taggart wrote:     

Perry Smith wrote:       

I want to have a module that I mixin to more than one model.

What would be the most "rails like" way to do this?

I put it in a file (my_mixin_module.rb) in /lib and then include it in each model that needs it:

class SomeModel < AR::B   include MyMixinModule end

Thanks. I was wondering if I need to add a require line at the top. I'll try it without and see what happens. I'm still not 100% clear of all the load magic in Rails.      I believe you do have to require the file first, if it's in lib. At least, I hope so, since automatically loading everything in lib would be a bit over-eager.

David

Are you sure? I don't require mine, and it's loaded automatically. Also there's this in the Rails API:

lib

  Application specific libraries. Basically, any kind of custom code that doesn't   belong under controllers, models, or helpers. This directory is in the load path.

Of course, I could be wrong. Chris

Hi --

Hi --

Chris Taggart wrote:

Perry Smith wrote:

I want to have a module that I mixin to more than one model.

What would be the most "rails like" way to do this?

I put it in a file (my_mixin_module.rb) in /lib and then include it in each model that needs it:

class SomeModel < AR::B   include MyMixinModule end

Thanks. I was wondering if I need to add a require line at the top. I'll try it without and see what happens. I'm still not 100% clear of all the load magic in Rails.

I believe you do have to require the file first, if it's in lib. At least, I hope so, since automatically loading everything in lib would be a bit over-eager.

David

Are you sure? I don't require mine, and it's loaded automatically. Also there's this in the Rails API:

lib

Application specific libraries. Basically, any kind of custom code that doesn't belong under controllers, models, or helpers. This directory is in the load path.

Of course, I could be wrong.

lib is definitely in the load path, but that means (or is supposed to mean) that it's in the $LOAD_PATH array (a.k.a. $:). If everything in the load path were pre-loaded, Ruby programs would take a long time to start up :slight_smile:

I'm definitely getting an error when I don't require my little test lib file, and not when I do, with Rails 1.2.3. Which version are you using?

David

dblack@wobblini.net wrote:

Hi --

Hi --

Chris Taggart wrote:

Perry Smith wrote:

I want to have a module that I mixin to more than one model.

What would be the most "rails like" way to do this?

I put it in a file (my_mixin_module.rb) in /lib and then include it in each model that needs it:

class SomeModel < AR::B   include MyMixinModule end

Thanks. I was wondering if I need to add a require line at the top. I'll try it without and see what happens. I'm still not 100% clear of all the load magic in Rails.

I believe you do have to require the file first, if it's in lib. At least, I hope so, since automatically loading everything in lib would be a bit over-eager.

David

Are you sure? I don't require mine, and it's loaded automatically. Also there's this in the Rails API:

lib

Application specific libraries. Basically, any kind of custom code that doesn't belong under controllers, models, or helpers. This directory is in the load path.

Of course, I could be wrong.      lib is definitely in the load path, but that means (or is supposed to mean) that it's in the $LOAD_PATH array (a.k.a. $:). If everything in the load path were pre-loaded, Ruby programs would take a long time to start up :slight_smile:

I'm definitely getting an error when I don't require my little test lib file, and not when I do, with Rails 1.2.3. Which version are you using?

David

1.2.3 also.

I've never investigated the $LOAD_PATH array (and almost everything I know about the Rails internals I learned from your excellent book, David), but could it be one of those Rails-y-type things where if you name the file the underscored version of the mixin -- see my response to the OP -- it looks for it in the various paths in the array.

Chris

Hi --

Hi --

Hi --

Chris Taggart wrote:

Perry Smith wrote:

I want to have a module that I mixin to more than one model.

What would be the most "rails like" way to do this?

I put it in a file (my_mixin_module.rb) in /lib and then include it in each model that needs it:

class SomeModel < AR::B   include MyMixinModule end

Thanks. I was wondering if I need to add a require line at the top. I'll try it without and see what happens. I'm still not 100% clear of all the load magic in Rails.

I believe you do have to require the file first, if it's in lib. At least, I hope so, since automatically loading everything in lib would be a bit over-eager.

David

Are you sure? I don't require mine, and it's loaded automatically. Also there's this in the Rails API:

lib

Application specific libraries. Basically, any kind of custom code that doesn't belong under controllers, models, or helpers. This directory is in the load path.

Of course, I could be wrong.

lib is definitely in the load path, but that means (or is supposed to mean) that it's in the $LOAD_PATH array (a.k.a. $:). If everything in the load path were pre-loaded, Ruby programs would take a long time to start up :slight_smile:

I'm definitely getting an error when I don't require my little test lib file, and not when I do, with Rails 1.2.3. Which version are you using?

David

1.2.3 also.

I've never investigated the $LOAD_PATH array (and almost everything I know about the Rails internals I learned from your excellent book,

Thanks :slight_smile:

David), but could it be one of those Rails-y-type things where if you name the file the underscored version of the mixin -- see my response to the OP -- it looks for it in the various paths in the array.

I believe you're right; there's a Rails "secret handshake" involved. That sounds familiar. It's not one I keep in mind much because I prefer to 'require' things, and stuff I put in lib is often developed outside of Rails and might not follow expected naming conventions.

David

I believe you're right; there's a Rails "secret handshake" involved. That sounds familiar. It's not one I keep in mind much because I prefer to 'require' things, and stuff I put in lib is often developed outside of Rails and might not follow expected naming conventions.

The rails autoloader likes things simple and discoverable. If you want stuff to autoload in development mode, put your classes and modules in single files named after the full class name. Your definition for your awesome Foo::Bar::Baz class should go in: lib/foo/bar/baz.rb. Rails will create modules for Foo and Bar for you too.

Using require means the Dependencies model won't track it, and therefore won't autoload it. I think you can use require_dependency instead, but that may have been deprecated.

Hi --

Oh, just use require then, it won't autoload or reload.