Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blowmage/4060467 to your computer and use it in GitHub Desktop.
Save blowmage/4060467 to your computer and use it in GitHub Desktop.
Variation of RubyTapas episode "021 Domain Model Events" without callbacks, using dirty, and keeping the tracker object.
class TasksController < ApplicationController
def update
if @task.update_attributes(params[:task])
tracker = PostSaveTaskTracker.new(@task)
TaskPusher.new(tracker, socket_id).push_changes
TaskMailSender.new(tracker, current_user).deliver_email
# success response
else
# failure respond
end
end
end
class TaskTracker
attr_reader :task
def initialize(task)
@task = task
end
def project_changed?
changed?("project")
end
def status_changed?
changed?("status")
end
def assignee_changed?
changed?("assignee")
end
def changed?(attribute)
if changed_attribute = changes[attribute]
changes.first != changes.last
end
end
def changes
task.changed_attributes
end
end
class PostSaveTaskTracker < TaskTracker
def changes
task.previous_changes
end
end
class TaskPusher < Struct.new(:task_tracker, :socket_id)
def push_changes
if task_tracker.assignee_changed?
# push assignee changes
end
if task_tracker.project_changed?
# push project changes
end
end
end
class TaskMailSender < Struct.new(:task_tracker, :recipient)
def deliver_email
if task_tracker.status_changed?
# email status change
end
if task_tracker.assignee_changed?
# email assignee change
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment