Commit 24bf3af50ddd3736e0dc17ca712e8230db9332f1

Authored by AntonioTerceiro
1 parent 5189d47d

ActionItem514: caching the categories menu

git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2218 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/admin/categories_controller.rb
... ... @@ -23,6 +23,7 @@ class CategoriesController < AdminController
23 23 if request.post?
24 24 begin
25 25 @category.save!
  26 + @saved = true
26 27 redirect_to :action => 'index'
27 28 rescue Exception => e
28 29 render :action => 'new'
... ... @@ -36,6 +37,7 @@ class CategoriesController < AdminController
36 37 @category = environment.categories.find(params[:id])
37 38 if request.post?
38 39 @category.update_attributes!(params[:category])
  40 + @saved = true
39 41 redirect_to :action => 'index'
40 42 end
41 43 rescue Exception => e
... ... @@ -43,10 +45,20 @@ class CategoriesController < AdminController
43 45 end
44 46 end
45 47  
  48 + after_filter :manage_categories_menu_cache, :only => [:edit, :new]
  49 +
46 50 post_only :remove
47 51 def remove
48 52 environment.categories.find(params[:id]).destroy
49 53 redirect_to :action => 'index'
50 54 end
51 55  
  56 + protected
  57 +
  58 + def manage_categories_menu_cache
  59 + if @saved && request.post? && @category.display_in_menu?
  60 + expire_fragment(:controller => 'public', :action => 'categories_menu')
  61 + end
  62 + end
  63 +
52 64 end
... ...
app/views/layouts/application.rhtml
... ... @@ -94,7 +94,9 @@
94 94 { :controller=>"home" },
95 95 :id=>"menu_link_to_envhome",
96 96 :title=>@environment.name %>
97   - <%= render :file => 'shared/categories_menu' %>
  97 + <% cache(:controller => 'public', :action => 'categories_menu') do %>
  98 + <%= render :file => 'shared/categories_menu' %>
  99 + <% end %>
98 100 </div><!-- id='navigation_bar' -->
99 101 <script type="text/javascript">
100 102 prepareMenu('navigation_bar', { timeout: 1000 });
... ...
config/routes.rb
... ... @@ -68,12 +68,8 @@ ActionController::Routing::Routes.draw do |map|
68 68 map.system 'system', :controller => 'system'
69 69 map.system 'system/:controller/:action/:id', :controller => Noosfero.pattern_for_controllers_in_directory('system')
70 70  
71   -
72   - ######################################################
73   - ## Test controllers.
74   - ## FIXME: this should not be needed
75   - ######################################################
76   - map.connect 'test/:controller/:action/:id' , :controller => /.*test.*/
  71 + # cache stuff - hack
  72 + map.cache 'public/:action/:id', :controller => 'public'
77 73  
78 74 # *content viewing*
79 75 # XXX this route must come last so other routes have priority over it.
... ...
test/functional/categories_controller_test.rb
... ... @@ -88,4 +88,52 @@ class CategoriesControllerTest &lt; Test::Unit::TestCase
88 88 end
89 89 end
90 90  
  91 + should 'expire categories menu cache when some menu category is updated' do
  92 + cat = Category.create!(:name => 'test category in menu', :environment => Environment.default, :display_in_menu => true)
  93 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').once
  94 + post :edit, :id => cat.id, :category => { :name => 'new name for category in menu' }
  95 + end
  96 +
  97 + should 'not touch categories menu cache whem updated category is not in menu' do
  98 + cat = Category.create!(:name => 'test category not in menu', :environment => Environment.default, :display_in_menu => false)
  99 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  100 + post :edit, :id => cat.id, :category => { :name => 'new name for category not in menu' }
  101 + end
  102 +
  103 + should 'expire categories menu cache when new category is created for the menu' do
  104 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').once
  105 + post :new, :category => { :name => 'my new category for the menu', :display_in_menu => '1' }
  106 + end
  107 +
  108 + should 'not handle cache when viewing "edit category" screen' do
  109 + cat = Category.create!(:name => 'test category in menu', :environment => Environment.default, :display_in_menu => true)
  110 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  111 + get :edit, :id => cat.id
  112 + end
  113 +
  114 + should 'not expire categories menu cache when new category is created, but not for the menu' do
  115 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  116 + post :new, :category => { :name => 'my new category for the menu', :display_in_menu => '0' }
  117 + end
  118 +
  119 + should 'not handle cache when viewing "new category" screen' do
  120 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  121 + get :new
  122 + end
  123 +
  124 + should 'not expire cache when updating fails' do
  125 + cat = Category.create!(:name => 'test category in menu', :environment => Environment.default, :display_in_menu => true)
  126 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  127 +
  128 + post :edit, :id => cat.id, :category => { :name => '' }
  129 +
  130 + cat.reload
  131 + assert_equal 'test category in menu', cat.name
  132 + end
  133 +
  134 + should 'not expire cache when creating fails' do
  135 + @controller.expects(:expire_fragment).with(:controller => 'public', :action => 'categories_menu').never
  136 + post :new, :category => { :display_in_menu => '1' }
  137 + end
  138 +
91 139 end
... ...