Rails acts_as_* plugins, with parameters

Hi all, I'm trying to write a plugin which will allow me to specify: acts_as_item :option=>:value

i need to be able to access the :options=>:value hash from instances of the model also. I've tried with class_eval in the plugin, but can't get it working. I'm calling acts_as_item(options), and that method can see the options passed from a model. Then inside the class_eval, I'm adding a method (def self.configuration) which returns the options hash. I thought from an instance, I'd be able to do instance.class.configuration which would then return said options hash.

Any ideas? thanks for reading.

module Item     #called by active record for us     def self.included(base)       base.extend ClassMethods     end

    module ClassMethods       def acts_as_item(options = {})         configuration = {:option=>:value}         class_eval {           include InstanceMethods

          def self.configuration             puts "in def acts_as_item (#{configuration})\n\n"           end         }       end     end

    module InstanceMethods       def item_name         puts self.class.configuration       end     end end

I'd probably add accessor methods for a class variable (or something like class_inheriting_accessor) and then call that accessor method from your acts_as_item method

Fred

I think you want this to be             def configuration

Since this is in a module extended by the class.

Hi Rick, Fred, I got the behavior i was looking for by using class variables in the class_eval block:         class_eval {           include InstanceMethods           @@config = options           def conf             @@config           end         }

instances can then do instance.conf and returns the options hash. I tried using class methods, and used def configuration, rather than def self., but I still couldnt' get that working. I'm still going to try and get it working that way as well, as I'd like to understand it a bit more.

I've looked at the code for the acts_as_tree module, and they're achieving this

from line 42. the configuration hash is available from within the class methods (self.roots and self.root), and on line 91 there's "self.class.roots" - which is what I was trying to do initially.

hrmmmm :slight_smile:

Frederick Cheung wrote:

Hi all, I'm trying to write a plugin which will allow me to specify: acts_as_item :option=>:value

i need to be able to access the :options=>:value hash from instances of the model also. I've tried with class_eval in the plugin, but can't get it working.

I'd probably add accessor methods for a class variable (or something like class_inheriting_accessor) and then call that accessor method from your acts_as_item method

Fred

Rick Denatale wrote: