3

我们的 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?方法回调看不到它们。各种其他策略导致它被添加到基类中,从而感染整个系统。有任何想法吗?

4

1 回答 1

0

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

如果我正确理解你在这里需要什么,我认为它会使代码和使用更清晰。

#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

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

于 2013-10-02T10:16:46.997 回答