【问题标题】:Deprecate entire model in Rails在 Rails 中弃用整个模型
【发布时间】:2012-12-02 10:05:43
【问题描述】:

我正在为客户从 Rails 2.x 重写/重构遗留应用程序到 3.x。作为重构的一部分,我还想从使用我们当地语言的模型/方法转向纯英文代码库。

这涉及为几乎每个功能编写新方法。我通过以下方法解决了这个问题:

def english_method
  # ...
end

def native_method
  warn 'DEPRECATED, please use #english_method'
  english_method
end

这适用于方法,并帮助我跟踪仍在使用旧方法的地方,而不会破坏任何代码。

但是,对于类(模型),我一直在做:

class NativeClass < EnglishClass
  # DEPRECATED, Please use EnglishClass
end

class EnglishClass
  # ...
end

这个“工作”,每当调用NativeClass 时,应用程序继续工作,但我在日志中没有收到任何消息通知我应用程序的一部分仍在调用NativeClass

如何确保每次“触摸”NativeClass 都会导致写入日志错误?

我尝试过(除了想“也许这行得通”之外没有其他原因):

class NativeClass < EnglishClass
  -> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' }
end

但这(显然?)没有用。我认为每次调用 NativeClass 时 lambda 都会延迟加载,但我对 lambdas 的理解仍然有些肤浅,所以在这里我可能会误会。

关于如何弃用整个类并在我的日志被触摸时向我的日志发送警告消息的任何线索?

欢迎使用其他“最佳做法”和/或弃用解决方案,但我不确定这是否是 SO 的有效问题(我不想冒着因这个问题而关闭该主题的风险)。

【问题讨论】:

    标签: ruby-on-rails class model deprecated


    【解决方案1】:

    尝试使用like:

    class NativeClass < EnglishClass
      def initialize
        ActiveSupport::Deprecation.warn "NativeClass is deprecated and may be removed from future releases, use EnglishClass instead.", caller
        super
      end
    end
    

    【讨论】:

    • 这个解决方案的问题(据我所知并经过测试)是,只有当我创建一个新的类对象时才会触发初始化方法。如果我在类本身或类中定义的常量上调用方法,则不会触发。
    【解决方案2】:

    您最好单独弃用每种方法。这可以通过使用 Rails 的 deprecate 方法并传递给它您要弃用的方法列表来轻松完成。通过将 false 传递给 public_instance_methods 可以使用类中定义的方法列表

    class NativeClass < EnglishClass
      def method1
      end
    
      def method2
      end
    
      deprecate *public_instance_methods(false)
    end
    

    注意,它需要在最后一个公共方法之后声明。

    【讨论】:

    • 实际上,我不想弃用所有方法(只是现在),我只想暂时弃用类名。所以我仍然希望所有方法保持不变,我只希望在使用已弃用的类名调用方法时发出警告。我可能会在所有其他方法中插入一个新的deprecate 方法,但我希望有一个更简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2019-04-28
    • 2018-01-29
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2019-12-10
    • 2017-01-24
    相关资源
    最近更新 更多