我想使用instance_eval增强现有类.原始定义包含验证,需要存在某些字段,即:

class Dummy < ActiveRecord::Base
  validates :field, :presence => true 
end

现在,我想使用instance_eval(或任何其他方法,真的)将其更改为可选:

Dummy.instance_eval do
  ...
end

删除验证的正确语法是什么,因此该字段是可选的.我宁愿直接在模型层上这样做,而不是在控制器或视图中进行奇怪的攻击.实际上并不需要使用instance_eval,但据我所知,这通常是增强Rails中类的最佳方法.

编辑#1

总的来说,最初的类是gem的一部分,我不想Forking 它,也不想绑定到特定的发行版.一般原因并不重要.简单地编辑原始模型的后果比猴子修补要糟糕得多.

推荐答案

我找到了一个解决方案,不确定它有多 Solidity ,但在我的情况下效果很好@复仇者实际上很接近他的答案.只是_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的特定验证器,它与validate回调的raw_filter访问器相同.

Ruby-on-rails相关问答推荐

使用RubyZip处理大型压缩文件:65535个文件的限制

有没有一种方法可以点击一个按钮来冒泡到父元素?

错误:部署到 Heroku 时找不到模块tailwindcss/defaultTheme

Rails:has_many 通过不返回结果

Sweet Alert 2 在 Rails 7 应用程序中无法正常工作

为什么总是有东西在我的 mac 上的 5000 端口运行

如何在 Rails 中注释掉 ERB?

我如何在不同的视图中使用助手

如何使用 Capistrano gem 为生产数据库 seeder ?

回形针图片网址

如何验证 ActiveRecord 中邮箱字段的格式?

我应该将全局共享部分模板放在哪个文件夹中?

ActiveRecord 查找现有表索引

Post.all.map(&:id) 是什么意思?

如何在 Rails 迁移中添加一些插入?

如何在 Rails 中设置路由的默认格式?

如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?

ActiveRecord 何时会保存关联?

保存用户偏好的最佳方法?

为什么 rails bootstrap 这么慢,我该怎么办?