Commit 24bf3af50ddd3736e0dc17ca712e8230db9332f1
1 parent
5189d47d
Exists in
master
and in
29 other branches
ActionItem514: caching the categories menu
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2218 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
4 changed files
with
65 additions
and
7 deletions
Show diff stats
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 < 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 | ... | ... |