[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Developing Rails plugin: need some metaprog. help

Joshua Muheim

11/22/2007 1:00:00 PM

Hi all

I'm developing an authorization plugin that looks like the following so
far:

module Incense
module Authorization
def self.included(base_class)
base_class.extend(ClassMethods)
end

module ClassMethods
def performs_authorization(options = {})
before_filter :prepare_user

include(InstanceMethods)
end
end
end

module InstanceMethods
private
def prepare_user
session[:user] ||= Member.find_by_id(2) # When there's no user_id
in the session, then use #2 for Guest
...
end

Because I extracted this functionality from an application, in
prepare_user() there's still a hardwired "Member" model used. But in
another application I need this to be a "User" model, so I'd like to be
able to specify the model to use in the options hash of the
performs_authorization() method. So how can I achieve this? Do I have to
use define_method() in the context of performs_authorization? This would
work, I guess, but I don't like it very much... Isn't there another way?

Thanks
Josh
--
Posted via http://www.ruby-....

4 Answers

Joshua Muheim

11/22/2007 1:02:00 PM

0

Maybe I can pass arguments to include() somehow?

include(InstanceMethods, model_to_use)

?
--
Posted via http://www.ruby-....

Giles Bowkett

11/22/2007 5:46:00 PM

0

> Maybe I can pass arguments to include() somehow?
>
> include(InstanceMethods, model_to_use)

That should be fine. Until you try to access it, it's just a variable.
You can have

variable.do_something()

and then later assign different objects to that variable. e.g.:

def sound(beast)
beast.make_noise
end

and then

sound(Cow) # => "moo"
sound(Dog) # => "woof"
sound(Rabbit) # => "squee"

--
Giles Bowkett

Podcast: http://hollywoodgrit.bl...
Blog: http://gilesbowkett.bl...
Portfolio: http://www.gilesg...
Tumblelog: http://giles....

Jean-François Trân

11/23/2007 8:00:00 PM

0

Hi Joshua,

> I'm developing an authorization plugin that looks like the
> following so far:
>
> module Incense
> module Authorization
> def self.included(base_class)
> base_class.extend(ClassMethods)
> end
>
> module ClassMethods
> def performs_authorization(options =3D {})
> before_filter :prepare_user
>
> include(InstanceMethods)
> end
> end
> end
>
> module InstanceMethods
> private
> def prepare_user
> session[:user] ||=3D Member.find_by_id(2) # When there's no user_id
> in the session, then use #2 for Guest
> ...
> end
>
> Because I extracted this functionality from an application, in
> prepare_user() there's still a hardwired "Member" model used.
> But in another application I need this to be a "User" model, so
> I'd like to be able to specify the model to use in the options
> hash of the performs_authorization() method. So how can I
> achieve this? Do I have to use define_method() in the context of
> performs_authorization? This would work, I guess, but I don't like
> it very much... Isn't there another way?

A simple way consists in storing the options hash as a class
variable, you can then create instance and class method
to get the class from the options hash :

def performs_authorization(options =3D {})
before_filter :prepare_user

cattr_accessor :options
self.options =3D options

include(InstanceMethods)
end

# give the name you want
def user_model
options[:user_model]
end

module InstanceMethods
private
def user_model
self.class.user_model
end

def prepare_user
session[:user] ||=3D user_model.find_by_id(2)
...
end
end

HTH,

-- Jean-Fran=E7ois.

Joshua Muheim

11/26/2007 9:50:00 AM

0

Thank you, Jean-François! But is this good style? I'm always looking for
well written patterns, and maybe I should dig deeper into Rails for
having a better overwiew about how they do things. :-)
--
Posted via http://www.ruby-....