Easy And/Or in Ruby on Rails
Posted by Christopher Wojno Tue, 07 Aug 2007 05:05:00 GMT
This missing feature of rails has really bugged me, but it’s so useful.
If you have a list of words such as: apples, oranges, and bananas as an array:
>> list = ['apples','oranges','bananas'] => ["apples", "oranges", "bananas"]
You’d like to be able to have a variable length list and still have it look correct in the view. So a smaller list:
>> list = ['oranges','bananas'] => ["oranges", "bananas"]
Should look like: “oranges and bananas”.
>> list = ['apples','oranges','bananas'] => ["apples", "oranges", "bananas"] >> and_or_list 'and', list => "apples, oranges, and bananas" >> list.pop => "bananas" >> and_or_list 'and', list => "apples and oranges" >> list.pop => "oranges" >> and_or_list 'and', list => "apples"
The following block of code will do just that:
def and_or_list( andor, list )
list = list.dup
comma = (list.size > 2 ? ',' : '')
list2 = list.pop if list.size > 1
s = list.join(', ')
s << comma+' '+andor+' ' + list2 if list2
s
end
Vioa!
Instant and easy listing of various things, in English. Your users will never know it’s generated.
I’ve wrapped it up in a neat little plug-in for you. Just install it in your vendor/plugins directory. It will automatically be available in your views.

Nice and useful. Now you need to write a method to replace this:
puts (x.length == 1 ? 'foo' : 'foos')Sure, it’s a one-liner, but I still see developers forget to handle this all the time. Not to mention the trinary operator tends to promote very long lines of code.
@Trevor Johns
See my next article for your mixin.