我正在使用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
这会扩展类的功能(这是我想要的)还是覆盖所有内容(不需要的)?
答案 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
,那么您的验证也会被添加到这个新类中。