gpt4 book ai didi

ruby-on-rails - 如何以编程方式将 ActiveModel 验证器从一个模型复制到另一个模型?

转载 作者:数据小太阳 更新时间:2023-10-29 07:39:29 26 4
gpt4 key购买 nike

我正在编写一个库,需要以编程方式将验证从一个模型复制到另一个模型,但我对如何实现这一点感到困惑。

我有一个模型,它是一个带有一些验证的 ActiveModel::Model:

class User < ActiveRecord::Base
validates :name, presence: true
end

还有另一个我想要进行相同验证的模型:

class UserForm
include ActiveModel::Model
attr_accessor :name
end

现在我想为 UserForm 提供与 User 相同的验证,并且不修改 User。复制验证器是行不通的,因为 ActiveModel::Validations 在验证检查期间 Hook 到回调中:

UserForm._validators = User._validators
UserForm.new.valid?
# => true # We wanted to see `false` here, but no validations
# are actually running because the :validate callback
# is empty.

不幸的是,似乎没有一种简单的方法可以让我看到以编程方式为一个模型提供另一个模型的验证回调并且仍然有效。我认为我最好的选择是让 Rails 根据给定时刻出现的验证器重新生成验证回调。

这可能吗?如果没有,是否有更好的方法来做到这一点?

最佳答案

检查 activerecord/lib/active_record/validations/presence.rb 的代码揭示了这是如何实现的:

# File activerecord/lib/active_record/validations/presence.rb, line 60
def validates_presence_of(*attr_names)
validates_with PresenceValidator, _merge_attributes(attr_names)
end

所以我想我会尝试使用 alias_method 连接到 validates_with

别名_method :orig_validates_with :validates_with

现在您有机会获得传递的值,因此您可以将它们存储在某处并在需要在 UserForm 上重新创建验证时检索它们

alias_method :orig_validates_with, :validates_with
def validates_with(*args)
# save the stuff you need, so you can recreate this method call on UserForm
orig_validates_with(*args)
end

然后您应该可以调用 UserForm.validates_with(*saved_attrs)。抱歉,这不是您可以复制/粘贴的内容,但这应该可以帮助您入门。

关于ruby-on-rails - 如何以编程方式将 ActiveModel 验证器从一个模型复制到另一个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23310873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com