(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.

