我想使用 instance_eval 增强现有类。原始定义包含验证,这需要存在某些字段,即:
class Dummy < ActiveRecord::Base
validates :field, :presence => true
end
现在我想使用 instance_eval(或任何其他方法,真的)将其更改为可选:
Dummy.instance_eval do
...
end
删除验证的正确语法是什么,因此该字段是可选的。我宁愿直接在模型层上这样做,而不是在 Controller 或 View 中进行奇怪的修改。 instance_eval 的使用并不是真正必需的,但据我所知,这通常是增强 Rails 类的最佳方式。
编辑#1
一般来说 - 原始类是 gem 的一部分,我不想 fork 它,也不想绑定(bind)到特定版本。一般原因并不重要。简单地编辑原始模型的后果比猴子修补要糟糕得多。
最佳答案
我找到了一个解决方案,不确定它有多可靠,但它对我来说效果很好。 @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
访问器相同。
关于ruby-on-rails - 如何使用 Rails 中的 instance_eval 子句删除验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7545938/