Each_with_styles, for adding CSS classes

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 "


puts item
puts “

puts “”
end

WILL RETURN:

hello
happy
birthday

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!