Rails 4:我可以第二次打开模型来定义方法吗?

时间:2014-08-15 15:20:43

标签: ruby-on-rails

我正在使用globalize gem来翻译我的name模型的Color属性。 gem似乎生成Color::Translation ActiveRecord模型,但它不提供app / models中的文件。

我想为这个模型添加验证,所以我想知道我是否可以创建一个名为app / models / color_translations.rb的文件并执行以下操作:

class Color::Translation < ActiveRecord::Base
  validates_presence_of :name
end

这会扩展类的功能(这是我想要的)还是覆盖所有内容(不需要的)?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于背景。如果有一个类Color::Translation,则加载app/models/color_translations.rb文件的结果将是添加该验证。但是如果没有这样的类,那么它将定义一个新类。

开发中的棘手问题是(通常)按需加载类 - 您通常不知道已加载的内容与可加载的内容。解决这个问题的一种方法是

Color::Translation.class_eval do
  validates_presence_of :name
end

永远不会创建一个新类 - 它将使用现有的类(如果需要Rails&#39;自动加载将启动)但如果它找不到它将会引发错误。

你遇到的第二个问题也是相关的:如果你把它放在app / models的文件中,如果这个类已经存在,那么rails会知道如何加载它?

看起来全局化会动态创建这些类,所以最安全的地方是将它放在color.rb的底部。这也确保了如果rails重新加载Color并且globalize因此创建了一个新的Color::Translation,那么您的验证也会被添加到这个新类中。