You can probably do something like this:
class Post < ActiveRecord::Base
after_save &AwardOne.method(:can_award?)
end
This will pass in the method as a block to ::after_save (#method returns
a proc and the & will coerce it to a block).
- Sonny
On 11/13/2014 11:39 PM, Debajit Adhikary wrote:
(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]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[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
<https://groups.google.com/d/msgid/rubyonrails-talk/303ca1b9-15f0-478f-9d69-1a25ddadca01%40googlegroups.com?utm_medium=email&utm_source=footer>.
For more options, visit https://groups.google.com/d/optout.
--
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/5465AF12.1070509%40gmail.com.
For more options, visit https://groups.google.com/d/optout.