Hi,
A common problem that everyone has come across is applying styles
to rows of information--pinstriping, or specifically marking
the first or last row. I came up with a general solution, and
so am offering it up here in case anyone finds it useful.
The solution is a method, added to the Array class, called
each_with_styles. Give it a hash and a block, and it will call
the block with two block parameters. The first will be the item,
like Array::each does, and the second will be a string containing
the list of relevant classes (as given by the hash).
Hope it comes in helpful!
~Mark Josef
EXAMPLE:
array = [''hello'', ''happy'',
''birthday'']
styles = { :all => ''every'', :first =>
''no_1'', :odd => ''strange'' }
array.each_with_styles(styles) do |item, style|
puts "<div class=''#{style}''>
puts item
puts "</div>"
puts ""
end
WILL RETURN:
<div class=''every no_1 strange''>
hello
</div>
<div class=''every''>
happy
</div>
<div class=''every strange''>
birthday
</div>
TO ADD IT TO YOUR PROJECT:
1. Create a file called ''each_with_styles.rb'' in your
project''s
/lib directory.
2. Include the code below in that file.
3. In your /app/controllers/application.rb file, add the line
''require "each_with_controller" '' to the top.
EACH_WITH_STYLES.RB:
# Adds each_with_styles to the Array class.
# each_with_styles takes an hash of optional
# class conditions, and returns a list of all
# that apply.
#
# Possible Conditions:
# ----------------------------------------------
# :all -- always applies
# :first -- only the first element
# :not_first -- all but the first element
# :last -- only the last element
# :not_last -- all but the last element
# :middle -- all but the first and last
# :not_middle -- first and last only
# :odd -- every other, starting with the first
# :even -- every other, starting with the second
class Array
def each_with_styles(styles)
styles = Hash.new unless styles && styles.class == Hash
each_with_index do |item, index|
style_array = Array.new
style_array << styles[:all]
style_array << (index == 0 ? styles[:first] : styles[:not_first])
style_array << (index == (length-1) ? styles[:last] :
styles[:not_last])
style_array << (index % 2 == 0 ? styles[:even] : styles[:odd])
style_array << (index > 0 && index < (length-1) ?
styles[:middle] : styles[:not_middle])
yield(item, style_array.compact.join('' ''))
end
end
end
AND THAT''S IT!