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.