(In the final code sample, the error I get is: 

NameError (undefined local variable or method `award_callback' for 
#<Post:0x002b57c04d52e0>): 

On Thursday, November 13, 2014 8:37:40 PM UTC-8, Debajit Adhikary wrote:
>
> I have the following classes:
>
>     class AwardBase
>     class AwardOne < AwardBase
>     class Post < ActiveRecord::Base
>
> The Post is an ActiveRecord, and the Award has a can_award? class method 
> which takes a post object and checks to see if it meets some criteria. If 
> yes, it updates post.owner.awards.
>
> I know I can do this using an Observer pattern (I tested it and the code 
> works fine). However, that requires me to add additional code to the model. 
> I'd like not to touch the model at all if possible. What I'd like to do is 
> run the Award checks like this (the trigger will be invoked at class load 
> time):
>
>     class AwardOne < AwardBase
>       trigger :post, :after_save
>
>       def self.can_award?(post)
>         ...
>       end
>     end
>
> The intention with the above code is that it should automatically add 
> AwardOne.can_award? to Post's after_save method
>
> So essentially what I'm trying to do is to get the above code to be 
> equivalent to:
>
>     class Post < ActiveRecord::Base
>       after_save AwardOne.can_award?(self)
>       ...
>     end
>
> which is basically:
>
>     class Post < ActiveRecord::Base
>       after_save :check_award
>
>       def check_award
>         AwardOne.can_award?(self)
>       end
>     end
>
> How can I do this without modifying the Post class?
>
> ----------------------------------
>
> Here's what I've done (which does not appear to work):
>
>     class AwardBase
>
>       def self.trigger (klass, active_record_event)
>         model_class = klass.to_class
>
>         this = self
>         model_class.instance_eval do
>           def award_callback
>             this.can_award?(self)
>           end
>         end
>
>         model_class.class_eval do
>           self.send(active_record_event, :award_callback)
>         end
>       end
>
>       def self.can_award? (model)
>         raise NotImplementedError
>       end
>     end
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/303ca1b9-15f0-478f-9d69-1a25ddadca01%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to