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.

Reply via email to