Commit f7c887983df69f0a733eb1fd1ba8097c1f28a444

Authored by Rodrigo Souto
1 parent 43535f4f

block: add support for custom display modes for blocks

Showing 2 changed files with 46 additions and 18 deletions   Show diff stats
app/models/block.rb
@@ -23,30 +23,41 @@ class Block < ActiveRecord::Base @@ -23,30 +23,41 @@ class Block < ActiveRecord::Base
23 # * <tt>:article</tt>: the article being viewed currently 23 # * <tt>:article</tt>: the article being viewed currently
24 # * <tt>:language</tt>: in which language the block will be displayed 24 # * <tt>:language</tt>: in which language the block will be displayed
25 def visible?(context = nil) 25 def visible?(context = nil)
26 - if display == 'never'  
27 - return false  
28 - end 26 + return false if display == 'never'
  27 +
29 if context 28 if context
30 - if language != 'all' && language != context[:locale]  
31 - return false  
32 - end  
33 - if display == 'home_page_only'  
34 - if context[:article]  
35 - return context[:article] == owner.home_page  
36 - else  
37 - return context[:request_path] == '/'  
38 - end  
39 - elsif display == 'except_home_page'  
40 - if context[:article]  
41 - return context[:article] != owner.home_page  
42 - else  
43 - return context[:request_path] != '/' + (owner.kind_of?(Profile) ? owner.identifier : '')  
44 - end 29 + return false if language != 'all' && language != context[:locale]
  30 +
  31 + begin
  32 + return self.send("display_#{display}", context)
  33 + rescue NoMethodError => exception
  34 + raise "Display '#{display}' is not a valid value."
45 end 35 end
46 end 36 end
  37 +
  38 + true
  39 + end
  40 +
  41 + def display_always(context)
47 true 42 true
48 end 43 end
49 44
  45 + def display_home_page_only(context)
  46 + if context[:article]
  47 + return context[:article] == owner.home_page
  48 + else
  49 + return context[:request_path] == '/'
  50 + end
  51 + end
  52 +
  53 + def display_except_home_page(context)
  54 + if context[:article]
  55 + return context[:article] != owner.home_page
  56 + else
  57 + return context[:request_path] != '/' + (owner.kind_of?(Profile) ? owner.identifier : '')
  58 + end
  59 + end
  60 +
50 # The condition for displaying a block. It can assume the following values: 61 # The condition for displaying a block. It can assume the following values:
51 # 62 #
52 # * <tt>'always'</tt>: the block is always displayed 63 # * <tt>'always'</tt>: the block is always displayed
test/unit/block_test.rb
@@ -205,4 +205,21 @@ class BlockTest &lt; ActiveSupport::TestCase @@ -205,4 +205,21 @@ class BlockTest &lt; ActiveSupport::TestCase
205 assert_not_equal block.created_at, duplicated.created_at 205 assert_not_equal block.created_at, duplicated.created_at
206 assert_not_equal block.updated_at, duplicated.updated_at 206 assert_not_equal block.updated_at, duplicated.updated_at
207 end 207 end
  208 +
  209 + should 'support custom display options for blocks visible' do
  210 + class MyBlock < Block
  211 + def display
  212 + 'even_context'
  213 + end
  214 +
  215 + def display_even_context(context)
  216 + context % 2 == 0
  217 + end
  218 + end
  219 +
  220 + block = MyBlock.new
  221 +
  222 + assert block.visible?(2)
  223 + assert !block.visible?(3)
  224 + end
208 end 225 end