我想使用instance_eval来增强现有的类。原始定义包含验证,它要求存在某些字段,例如:
class Dummy < ActiveRecord::Base
validates :field, :presence => true
end现在,我想使用instance_eval (或任何其他方法,实际上)将其更改为optional:
Dummy.instance_eval do
...
end删除验证的正确语法是什么,因此该字段是可选的。我宁愿直接在模型层上做这件事,而不是在控制器或视图中进行奇怪的修改。使用instance_eval并不是必须的,但据我所知,这通常是增强Rails中类的最好方法。
编辑#1
一般来说,原始类是gem的一部分,我不想将其派生出来,也不想将其绑定到特定的发行版。一般的原因并不是很重要。简单地编辑原始模型的后果要比修补猴子严重得多。
发布于 2012-06-30 04:45:44
我找到了一个解决方案,不确定它有多可靠,但它在我的情况下工作得很好。@aVenger实际上与他的答案很接近。只是_validators访问器只包含用于反射的信息,而不包含实际的验证器回调!它们包含在_validate_callbacks访问器中,不要与_validations_callbacks混淆。
Dummy.class_eval do
_validators.reject!{ |key, _| key == :field }
_validate_callbacks.reject! do |callback|
callback.raw_filter.attributes == [:field]
end
end这将删除:field的所有验证器。如果您想要更精确,可以拒绝特定的_validators验证器,该验证器与验证回调的raw_filter访问器相同。
发布于 2014-11-17 10:20:43
我认为这是目前最实际的解决方案(我使用的是rails 4.1.6):
# Common ninja
class Ninja < ActiveRecord::Base
validates :name, :martial_art, presence: true
end
# Wow! He has no martial skills
Ninja.class_eval do
_validators[:martial_art]
.find { |v| v.is_a? ActiveRecord::Validations::PresenceValidator }
.attributes
.delete(:martial_art)
end发布于 2015-04-27 06:19:22
删除所有验证的最简单方法:
clear_validators!https://stackoverflow.com/questions/7545938
复制相似问题