Sometimes you just want to use an Enum. Unfortunately, if you're a Ruby developer, Ruby does not offer a native enum structure. Here's a simple approach using a mixin module:
module Enum def const_missing(key) @enum_hash[key] end def add_enum(key, value) @enum_hash ||= {} @enum_hash[key] = NameValuePair.new(value, key.to_s.downcase) end def each @enum_hash.each {|key, value| yield(key, value) } end def enums @enum_hash.keys end def enum_values @enum_hash.values end def get_enum_hash @enum_hash end def find_by_key(key) @enum_hash[key.upcase.to_sym] end end
The Enum mixin depends on a NameValuePair class to hold the data:
class NameValuePair attr_reader :label, :value def initialize(label, value) @label = label @value = value end def first @label end def last @value end end
I included first and last methods to better support the select and options_for_select helper methods in Rails. Here's how you might use it:
class FooEnum extend Enum self.add_enum(:APPLE, "Apple") self.add_enum(:PEAR, "Pear") self.add_enum(:ALL, "All Fruit") end FooEnum::APPLE ==> #<NameValuePair @value="apple", @label="Apple"> FooEnum::ALL.value ==> "all" FooEnum::ALL.label ==> "All Fruit" FooEnum.find_by_key('apple') ==> #<NameValuePair @value="apple", @label="Apple">
When deploying a Rails application using Capistrano, I discovered I needed a way to specify the username and password for Subversion and I didn't want to hardcode this information. I found an excellent suggestion on Jonathan.inspect. I didn't follow his advice exactly, but I ended up with something fairly close that I added to my deploy.rb script:
Recent comments
13 weeks 3 days ago