Matthew Beale
2006-Jun-21 20:28 UTC
[Rails] Plugin Panic! - no accessing a model''s class methods?
Hi plugin-authors.
So this is a little bit of take two on this question, but why can''t I
access a singleton on the model calling my plugin? The crux of the full
plugin below is:
#logger.info self.class.to_s
new_copy = self.class.new( @copyable_attributes )
the logger spits out "Datatype", but I get an error from rails saying:
undefined method `datatype'' for false:FalseClass
for the self.class.new line. I also feel haunted by the knowledge that
this is far easier than I think it is, though I cannot seem to find the
answer in the acts_as_versioned or any other plugin (since none create new
instances of their calling model class).
full plugin contents follow.
*whimper* help?
--
Matthew Beale :: 607 227 0871
Resume & Portfolio @ http://madhatted.com
# ActsAsCopyable
module FakeActiveRecord
module Acts #:nodoc:
module Copyable #:nodoc:
def self.append_features(base)
super
base.extend(MacroMethods)
end
# declare the class level helper methods which
# will load the relevant instance methods
# defined below when invoked
module MacroMethods
def acts_as_copyable
include FakeActiveRecord::Acts::Copyable::InstanceMethods
end
end
# Adds instance methods.
module InstanceMethods
def copy( options = {} )
@copyable_attributes = self.attributes
@copyable_attributes.delete ''id''
options.each do |key, value|
next if key.class == String
options.delete key
options[key.to_s] = value
end
@copyable_attributes.merge! options
#logger.info self.class.to_s
new_copy = self.class.new( @copyable_attributes )
new_copy.save
end
end
end
end
end
Matthew Beale
2006-Jun-21 21:27 UTC
[Rails] Re: Plugin Panic! - no accessing a model''s class methods?
Hi again plugin-dieties!
Since noone wants to look at this, I''ll make it easy. This does the
same thing a plugin does, right?
---------------------------------------------
class RealSpore # aka ActiveRecord
end
module PluginSpore # aka FakeActiveRecord in a plugin
def self.append_features(base)
super
base.extend(MacroMethods)
end
module MacroMethods
def acts_as_clonable
include PluginSpore::InstanceMethods
end
end
module InstanceMethods
def clone
self.class.new
end
end
end
# Load it, ala plugins
RealSpore.class_eval do
include PluginSpore
end
# Ok, now load like a model loads in rails
class SmithSpore < RealSpore
acts_as_clonable
end
# call it new like a controller
bob = SmithSpore.new
# copy/clone it
bobs_brother = bob.clone
p ''bob has DNA of: '' + bob.inspect
p ''bobs brother bas DNA of: '' + bobs_brother.inspect
-------------------------------------
Well that code works fine. Why doesn''t this plugin do the same?
I''ll
file a bug tomorrow if I can''t come up with anything more.
--
Matthew Beale :: 607 227 0871
Resume & Portfolio @ http://madhatted.com
Matthew Beale wrote:> Hi plugin-authors.
>
> So this is a little bit of take two on this question, but why
can''t I
> access a singleton on the model calling my plugin? The crux of the full
> plugin below is:
>
> #logger.info self.class.to_s
> new_copy = self.class.new( @copyable_attributes )
>
> the logger spits out "Datatype", but I get an error from rails
saying:
>
> undefined method `datatype'' for false:FalseClass
>
> for the self.class.new line. I also feel haunted by the knowledge that
> this is far easier than I think it is, though I cannot seem to find the
> answer in the acts_as_versioned or any other plugin (since none create
> new
> instances of their calling model class).
>
> full plugin contents follow.
>
> *whimper* help?
>
> --
> Matthew Beale :: 607 227 0871
> Resume & Portfolio @ http://madhatted.com
>
>
> # ActsAsCopyable
> module FakeActiveRecord
> module Acts #:nodoc:
> module Copyable #:nodoc:
>
> def self.append_features(base)
> super
> base.extend(MacroMethods)
> end
>
> # declare the class level helper methods which
> # will load the relevant instance methods
> # defined below when invoked
> module MacroMethods
> def acts_as_copyable
> include FakeActiveRecord::Acts::Copyable::InstanceMethods
> end
> end
>
> # Adds instance methods.
> module InstanceMethods
> def copy( options = {} )
> @copyable_attributes = self.attributes
> @copyable_attributes.delete ''id''
> options.each do |key, value|
> next if key.class == String
> options.delete key
> options[key.to_s] = value
> end
> @copyable_attributes.merge! options
> #logger.info self.class.to_s
> new_copy = self.class.new( @copyable_attributes )
> new_copy.save
> end
> end
>
> end
> end
> end
--
Posted via http://www.ruby-forum.com/.