Encapsulate dependencies of stats index page

This may be a bit extreme.

It's modeled after the ideal "rails way".

In the controller, we now know the name of a single resource. It
doesn't happen to be backed by a database table, but it does know all
about the task of collecting stats, leaving the controller concerned
with just munging params and rendering stuff.

I called the resource `IndexPage`, to avoid the temptation of trying to
reuse it, which can get pretty messy.

Later, if a better abstraction appears, it should be fairly painless to
alter.
This commit is contained in:
Katrina Owen 2013-03-02 17:35:19 -07:00
parent 6df3534baf
commit d5a555fbac
3 changed files with 50 additions and 15 deletions

View file

@ -8,15 +8,7 @@ class StatsController < ApplicationController
def index def index
@page_title = t('stats.index_title') @page_title = t('stats.index_title')
@hidden_contexts = current_user.contexts.hidden @hidden_contexts = current_user.contexts.hidden
@actions = Stats::Actions.new(current_user) @stats = Stats::IndexPage.new(current_user)
@totals = Stats::Totals.new(current_user)
@projects = Stats::Projects.new(current_user)
@contexts = Stats::Contexts.new(current_user)
tags = Stats::TagCloudQuery.new(current_user).result
@tag_cloud = Stats::TagCloud.new(tags)
cutoff = 3.months.ago.beginning_of_day
tags = Stats::TagCloudQuery.new(current_user, cutoff).result
@tag_cloud_90days = Stats::TagCloud.new(tags)
end end
def actions_done_last12months_data def actions_done_last12months_data

View file

@ -0,0 +1,43 @@
module Stats
class IndexPage
attr_reader :user
def initialize(user)
@user = user
end
def actions
@actions ||= Stats::Actions.new(user)
end
def totals
@totals ||= Stats::Totals.new(user)
end
def projects
@projects ||= Stats::Projects.new(user)
end
def contexts
@contexts ||= Stats::Contexts.new(user)
end
def tag_cloud
unless @tag_cloud
tags = Stats::TagCloudQuery.new(user).result
@tag_cloud = Stats::TagCloud.new(tags)
end
@tag_cloud
end
def tag_cloud_90days
unless @tag_cloud_90days
cutoff = 3.months.ago.beginning_of_day
tags = Stats::TagCloudQuery.new(user, cutoff).result
@tag_cloud_90days = Stats::TagCloud.new(tags)
end
@tag_cloud_90days
end
end
end

View file

@ -1,22 +1,22 @@
<div class="stats_content"> <div class="stats_content">
<h2><%= t('stats.totals') %></h2> <h2><%= t('stats.totals') %></h2>
<%= render :partial => 'totals', :locals => {:totals => @totals} -%> <%= render :partial => 'totals', :locals => {:totals => @stats.totals} -%>
<% unless current_user.todos.empty? -%> <% unless current_user.todos.empty? -%>
<h2><%= t('stats.actions') %></h2> <h2><%= t('stats.actions') %></h2>
<%= render :partial => 'actions', :locals => {:actions => @actions} -%> <%= render :partial => 'actions', :locals => {:actions => @stats.actions} -%>
<h2><%= t('stats.contexts') %></h2> <h2><%= t('stats.contexts') %></h2>
<%= render :partial => 'contexts', :locals => {:contexts => @contexts} -%> <%= render :partial => 'contexts', :locals => {:contexts => @stats.contexts} -%>
<h2><%= t('stats.projects') %></h2> <h2><%= t('stats.projects') %></h2>
<%= render :partial => 'projects', :locals => {:projects => @projects} -%> <%= render :partial => 'projects', :locals => {:projects => @stats.projects} -%>
<h2><%= t('stats.tags') %></h2> <h2><%= t('stats.tags') %></h2>
<%= render :partial => 'tags', :locals => {:tag_cloud => @tag_cloud, :key => ''} -%> <%= render :partial => 'tags', :locals => {:tag_cloud => @stats.tag_cloud, :key => ''} -%>
<%= render :partial => 'tags', :locals => {:tag_cloud => @tag_cloud_90days, :key => '_90days'} -%> <%= render :partial => 'tags', :locals => {:tag_cloud => @stats.tag_cloud_90days, :key => '_90days'} -%>
<% else -%> <% else -%>