Jean-François Trân
11/23/2007 8:00:00 PM
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.