Skip to content

Instantly share code, notes, and snippets.

@rinaldifonseca
Created January 28, 2013 00:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rinaldifonseca/4651815 to your computer and use it in GitHub Desktop.
Save rinaldifonseca/4651815 to your computer and use it in GitHub Desktop.
pubsub
require "delegate"
class PostsController < ApplicationController
respond_to :html, :json
module PubSub
def add_observer(observer)
(@observers ||= []) << observer
end
def publish(event, *args)
@observers.each do |observer|
observer.send(event, *args) if observer.respond_to? event
end if @observers
end
end
class PostMailer
def post_created(post)
Rails.logger.info "-- sending email"
end
end
class HtmlResponder < SimpleDelegator
def post_created(post)
redirect_to post, notice: 'Post was successfully created.'
end
def post_create_failed(post)
render action: "new"
end
end
class PostCreator
include PubSub
def initialize(post)
@post = post
end
def create
if @post.save
publish(:post_created, @post)
else
publish(:post_create_failed, @post)
end
end
end
def create
@post = Post.new(params[:post])
post_creator = PostCreator.new(@post)
post_creator.add_observer HtmlResponder.new(self)
post_creator.add_observer PostMailer.new(params)
post_creator.create
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment