ruby-on-rails - Ruby 类评估,validates_inclusion_of 与动态数据

标签 ruby-on-rails ruby class

如果我有如下的ActiveRecord模型

class Foo < ActiveRecord::Base
  validates_inclusion_of :value, :in => self.allowed_types

  def self.allowed_types
    # some code that returns an enumerable
  end
end

这不起作用,因为在评估验证时尚未定义 allowed_types 方法。我能想到的所有修复基本上都是围绕将方法定义移到验证之上,以便在需要时可用。

我明白这可能更像是一个编码风格问题(我希望我的所有验证都在模型顶部,方法在底部)但我觉得应该有某种解决方案,可能涉及初始模型加载的惰性评估?

我想做的事有可能吗?我应该只在验证之上定义方法,还是有更好的验证解决方案来实现我想要的。

最佳答案

为此,您应该能够使用 lambda 语法。大概是这样的:

class Foo < ActiveRecord::Base
  validates_inclusion_of :value, :in => lambda { |foo| foo.allowed_types }

  def allowed_types
    # some code that returns an enumerable
  end
end

这样它将在每次验证时评估 lambda block 并将 Foo 的实例传递给该 block 。然后它将返回该实例中 allowed_types 的值,以便对其进行动态验证。

另请注意,我从 allowed_types 方法声明中删除了 self.,因为那样会创建一个类方法,而不是您在这里想要的实例方法。

关于ruby-on-rails - Ruby 类评估,validates_inclusion_of 与动态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105865/

相关文章:

c++ - 类枚举的正确位置

javascript - 用户在 Rails 5 中使用 Devise 登录后运行 JS 代码

ruby-on-rails - Active Admin - 如何在更新表单时添加 'confirm' 弹出窗口

ruby-on-rails - form_for 嵌套资源(单数)未使用正确的路径助手

ruby - 使用正则表达式将 ruby 字符串分块

Java 通过最终数组定义类成员

ruby-on-rails - 清除 OS X 上的 memcached 服务器中的缓存

ruby - Rails,防止 Model.scoped 的弃用警告,找到(:all) and relation #all?

ruby - 将作为键值对的字符串转换为 ruby​​ 中的哈希

delphi - 我什么时候应该在 Delphi 中使用增强的记录类型而不是类?