Ruby on Rails Sunday, February 23, 2014



On Saturday, 22 February 2014 15:05:44 UTC-5, Ruby-Forum.com User wrote:
Hello,

MyModel.rb,

TYPES = { "type1" => 1 , "type2" => 2, "type3" => 3 }.freeze
validates_inclusion_of :my_type, :in => TYPES.keys

---------------------------------------
MyModelPatch.rb,

base.send(:remove_const, :TYPES)
base._validators[:my_type].reject!{ |validator| validator if
validator.is_a? ActiveModel::Validations::InclusionValidator }

TYPES = { "type1" => 1 , "type2" => 2, "type3" => 3,"type4" => 4,
"type5" => 5 }.freeze
base.const_set('TYPES',TYPES)
base.class_eval do
   validates_inclusion_of :my_type, :in => TYPES.keys
end

----------------------------------------

In my View or Console, The MyModel::TYPES gives me the patched hash, But
saving the patched model with the new types failes. With the error "is
not included in the list"

Please help me, As I am not able to figure out what wrong I have done,
And am I missing something.


The _validations attribute is kept in sync by the various macros (validates_* and validates itself), but it is NOT the mechanism used to actually do the validation - that's handed off to the callbacks stuff (which also handles :on, :if, and :unless criteria).

This post seems closer to what you're intending:

http://gistflow.com/posts/749-canceling-validations-in-activerecord

But I'd recommend thinking more about what the intent actually is - if you're trying to override the list of possible types in a subclass, it would make more sense to have an explicit validator that *asks* the class for the correct set of types to be used.

--Matt Jones

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/f6e4a44b-27a9-4971-8644-b5373000ad47%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

No comments:

Post a Comment