|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Maybe I can pass arguments to include() somehow?
include(InstanceMethods, model_to_use) ? -- Posted via http://www.ruby-forum.com/. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
> 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.blogspot.com Blog: http://gilesbowkett.blogspot.com Portfolio: http://www.gilesgoatboy.org Tumblelog: http://giles.tumblr.com |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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 ptionsself.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. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
![]() |
| Outils de la discussion | |
|
|