gpt4 book ai didi

ruby-on-rails - 在 Ruby on Rails 中向 ActiveRecord 实例添加验证回调

转载 作者:行者123 更新时间:2023-12-04 22:00:41 25 4
gpt4 key购买 nike

我们的 ActiveRecord 模型有许多验证不幸地使用了网络。例如,它使用 Facebook API 来验证给定的 Facebook ID 属性。我想将这些验证移出模型,以便它们仅在特定上下文中运行,而不是在测试中由 Factory Girl 创建时运行。它还需要以与 ActiveAdmin 兼容的方式完成。

我的想法是将方法提取到一个模块中,并让该模块适本地扩展 AR 实例。

module ArtistConnectionValidations
def self.inject_to(record)
record.extend self
record.class_eval do
before_validation :validate_facebook_name
end
end

def validate_facebook_name
# Contact Facebook API
end
end

在使用继承资源的 ActiveAdmin 中:

controller do  # Executes in controller context
def resource
ArtistConnectionValidations.inject_to(Artist.find(params[:id]))
end
end

不幸的是,这些验证没有被调用,因为它们被添加到实例的单例类中并且 #valid? 方法回调看不到它们。各种其他策略导致它被添加到基类中,从而感染整个系统。有什么想法吗?

最佳答案

我不确定这是否适合您。但是为什么不创建一个子类呢?

如果我正确理解了您在这里的需求,我认为这会使代码和使用更简洁。

#artist.rb
class Artist < ActiveRecord::Base
end

#artist_with_validations.rb
class ArtistWithValidations < Artist
before_validation :validate_facebook_name

def validate_facebook_name
# Contact Facebook API
end
end

然后您可以使用两种模型中的一种,具体取决于您是否希望用户进行验证。

关于ruby-on-rails - 在 Ruby on Rails 中向 ActiveRecord 实例添加验证回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11847750/

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