ruby-on-rails - 如何使用 Rails 中的 instance_eval 子句删除验证?

标签 ruby-on-rails ruby validation activerecord

我想使用 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/

相关文章:

ruby - 解释一个ruby代码片段

ruby - RSpec 是否有可能期望两个表发生变化?

c# - 在编辑器模板 (MVC 5) 中访问远程验证属性

forms - 将 $html->tagErrorMsg 从 CakePhp 1.1 更新到 1.2

ruby-on-rails - 如何在 ruby​​ 中为散列预拆分字符串?

ruby-on-rails - Rails 中脚手架的用例有哪些?什么时候该用,什么时候不用?

mysql - Rails中如何在短时间内为100万用户的表中的用户生成slug而不影响数据库性能?

java - 如何检查日期字符串的有效性?

ruby-on-rails - 使 jQuery 与 Turbolinks 一起工作

ruby-on-rails - 如何在 Rails 4 中禁用输入作为选择