validates_inclusion_of doesn't match constant

Hello, I have a model Model:

SPECIAL_FEATURES = %w(none top) class Model   validates_inclusion_of :special_feature, :in => Model::SPECIAL_FEATURES,                          :on => :create, :message => "special_feature %s is not defined"   belongs_to :team

  def special_feature     attributes = attributes_before_type_cast     if attributes["special_feature"]       read_attribute(:special_feature).to_sym     else       nil     end   end

  def special_feature=(value)     write_attribute(:special_feature, value.to_s)   end end

In another class I do:

model = Model.new model.special_feature = :none model.save!

Then I got this error:

Validation failed: Special feature special_feature {:model=>"Model", :attribute=>"Special feature", :value=>"none"} is not defined (ActiveRecord::RecordInvalid)!

But I think it's defined... I've followed some tips to work with enums, so it seems this is the way to work with them, but I'm doing something wrong, any ideas?

Then I got this error:

Validation failed: Special feature special_feature {:model=>"Model", :attribute=>"Special feature", :value=>"none"} is not defined (ActiveRecord::RecordInvalid)!

I wonder if there's some confusion due to you assigning a symbol, but checking for strings...

Try:

Well, I've just tested with "none" and 'none' and I've got the same error.

I think symbol/string confusion is the problem, but not in that way. Your setter method coerces everything to a string to clearly it doesn't matter if you pass a string or a symbol to that. However your getter method forces its return value to be a symbol, which your validation then tries to compare to a string.

Fred

Gah! I didn't even look at the methods... why overload them? oh well, I'm sure there's a perfectly valid reason</cynical disbelief>

So Eduardo, change the constant: SPECIAL_FEATURES = [:none, :top]

...does that do it?

You might also want to change the setter:

def special_feature=(value)    write_attribute(:special_feature, value.to_s.to_sym) end

Worth a bash... or better yet, I could fire up a console and check... but I've gotta pack for a trip in the morning, so no time ATM

Thanks Michael, that was enough so it works now. I followed the tip to emulate enums from this article (http://thinkinginrails.com/2010/04/ more-on-using-enums-for-constant-data-in-rails/), but it seems to have a little mistake.