# Enumitation ## What is it? **enum + imitation = Enumitation** ## Why? Ever wanted to restrict an ActiveRecord attribute to specific values, but thought a join table to contain the values and a foreign key constraint were overkill? Well, you could opt for an enum field, but maybe your DBMS doesn't support enums. Or maybe it does, but you just aren't in the mood for an enum field today. Also, do you need to provide these values as options in a select form field? Enumitation exists to allow restrictions on ActiveRecord attribute values without the need for a join table or enum field, while also providing those values for the purpose of options in a select field in a form. ## Example class Publisher < ActiveRecord::Base enumitation :location, %w[US CA] end Here we've specified that we want the `location` attribute to be an enum with the values *US* and *CA*. The `enumitation` method does two important things: * it adds a `validates_inclusion_of` validation to the model, using the values specified when declaring the enumitation * it provides a `select_options_for` method that can be used to provide a select tag with options In the console: publisher = Publisher.new location: 'MX' publisher.valid? #=> false publisher.errors #=> {:location=>["is not included in the list"]} publisher.location = 'US' #=> "US" publisher.valid? #=> true Publisher.select_options_for :location #=> [["US", "US"], ["CA", "CA"]] ## Custom Labels (i18n) You can provide alternate labels for your values in your locale files. These labels will be returned from the `select_options_for` method. In *config/locales/en.yml*: en: enumitation: models: publisher: location: US: 'United States' CA: 'Canada' Now when calling the `select_options_for` method: Publisher.select_options_for :location #=> [["United States", "US"], ["Canada", "CA"]] So, from your view: = form_for :publisher do |f| = f.select :location, Publisher.select_options_for(:location) ### But this is no big deal! I know. It really isn't that big of a deal, and it wouldn't take that much effort to reproduce by hand what Enumitation provides. But why do all that work when you can get it from a one-liner? ### There are other gems that practically do the same thing. True, but the ones I found either didn't fit my needs or they did so much more than I needed. I wanted something that fit my needs exactly and nothing more. ## Testing bundle exec rspec spec ## Contributing If you think Enumitation could be better, fork away and send a pull request! Please make sure to include specs for your changes.