【发布时间】:2011-02-17 05:53:08
【问题描述】:
在找到正确的方法来混合我放入 Rails 2.3.5 的 lib/ 目录中的代码时有点困难。
我有几个需要电话验证的型号。我至少有三个使用相同代码的模型,所以我想保持干燥并将其移到 lib/ 目录中。我曾经在每个模型中都有这样的代码:
validate :phone_is_valid
然后我会在模型中有一个 phone_is_valid 方法:
protected
def phone_is_valid
# process a bunch of logic
errors.add_to_base("invalid phone") if validation failed
end
我将此代码移出到 lib/phones/ 中,在 lib/phones 中我有 lib/phones/phone_validation.rb,并在其中复制粘贴了 phone_is_valid 方法。
我的问题是,我现在如何将它混合到我的所有模型中?我的 validate :phone_is_valid 方法是保持不变还是会改变?我想确保 errors.add_to_base 方法继续像以前一样运行,同时保持一切干燥。显然以下方法不起作用:
validate :Phones::PhoneValidation::phone_is_valid(number)
我还在 lib/phones/ 中创建了另一个名为 lib/phones/phone_normalize.rb 的文件。同样,许多模型需要对用户输入的值进行归一化。意思是将 (555) 222-1212 转为 5552221212 或类似的东西。我可以通过调用 Phones::Phone_Normalize::normalize_method(number) 来调用它吗?
我想我对以下内容感到困惑:
- 如何使用 lib 目录来验证需要访问特定验证方法的多个模型
- 如何将 lib 目录用于返回值的常用共享方法
【问题讨论】:
-
我正在做一个需要验证电话号码的项目。我不知道您是否会觉得这很有用,但我将电话号码(及其可能的扩展名)放入了他们的 OWN 模型中。您可以使用此功能做的一件很酷的事情是,您可以搜索电话号码以查找与其相关联的 X、Y 或 Z 类型。我还有一个 before_save 方法,它在保存之前去掉所有的括号、连字符等,这样它们就可以很容易地搜索到,然后你可以很容易地在视图中格式化电话号码,使它们是统一的。希望这些想法有用。
标签: ruby-on-rails ruby activerecord