Ruby中的类别别名

我正在开发一个基于类似现有的新的Rails应用程序。 在我的旧应用程序中,我有Coupon类,这与我的新应用程序中的Ticket非常相似。 我想重复使用Coupon中的所有代码,但是要使用新的类名称。

由于重构在Rails中很麻烦,我想知道是否有办法在Ruby中为类创build别名(类似于属性和方法的别名)。

  • Rails的 - link_to助手与data- *属性
  • validates_uniqueness_of传递nil或空白(没有allow_nil和allow_blank)
  • 在Rails资产pipe道中使用字体
  • AngularJS-每个路由和控制器中的login和authentication
  • Rails 3跳过validation和callback
  • Rails自动分配已经存在的id
  • 如何在Ruby中search数组?
  • 如何在S3中存储数据并允许用户使用Rails API / iOS客户端以安全的方式访问?
  • 5 Solutions collect form web for “Ruby中的类别别名”

    Ruby中没有名称。 它们只是分配给variables的对象,就像任何其他对象一样。 如果你想通过一个不同的variables来引用一个类,把它赋给一个不同的variables:

    Foo = String 

    在文件coupon.rb中:

     class Coupon #... end # add this line of code to make alias for class names # option1. if you haven't defined a "Ticket" class: Ticket = Coupon # option2. if Ticket has been defined, you have to redefine it: Object.send :remove_const, "Ticket" const_set "Ticket", Coupon 

    “以大写字母开头的任何引用,包括类和模块的名称,都是一个常量” – “元编程ruby >>,第38页,常量部分

    任何人都来这里寻找如何别名轨道模型类有一个新的名字:

    我可以简单地做Foo = Bar ,但是必须把Foo放到它自己的模型文件中,这样我才不会得到未初始化的常量错误。 例如

     # models/foo.rb Foo = Bar 

    你也许会发现在has_manyhas_one等关联中使用别名的奇怪现象。我发现你通常可以通过使用根名称空间(或者根据你的模型的结构而定的适当的名字空间)来解决这些问题,以确保Rails是试图自动加载正确的常量:

     has_many :foo, class_name: '::Foo' 

    我同意warhog,或多或less – 但我会从你的优惠券类中分类票 – 这样,如果你需要做任何数据传输,你可以把代码放在你的票类

    你必须小心这个,因为如果你的类经历了任何状态改变(增加了函数,改变常量,类variables等),你的类在别名被实例化所处的状态将不会反映你的更新类。

    为了避免腕骨隧道而不牺牲可读性 ,你可以在你的别名对象而不是实际的类中存储一个lambda。 当然,lambda包含类,但这可以确保你的别名将调用你的类的最新版本。

    我把这个放在我的supermanpatches.rb rails初始化器(在config/initializers/里面)‡

     LAP = lambda { LosAngelesParcel } 

    现在你可以使用LAP[]调用这个类,并且你的类的一个新版本将被加载。 (允许你创build实例,例如, l = LAP[].new

    轨道加载时运行一次,然后通过您的应用程序普及,可调用的任何地方像一个全局variables,但“只读”,可以这么说