Rails 4.1 Ruby 2.0 Windows 8.1
我的应用程序中有三种不同的型号,我需要"消毒"保存前的电话号码和电子邮件。我可以在每个模型中做这样的事情:
before_save :sanitize_phones_and_email
并在helpers / application_helper.rb中:
def sanitize_phones_and_email
(self.email = email.downcase) if attribute_present?("email")
(self.work_phone = phony_normalize work_phone, :default_country_code => 'US') if attribute_present?("work_phone")
(self.mobile_phone = phony_normalize mobile_phone, :default_country_code => 'US') if attribute_present?("mobile_phone")
(self.fax_phone = phony_normalize fax_phone, :default_country_code => 'US') if attribute_present?("fax_phone")
(self.other_phone = phony_normalize other_phone, :default_country_code => 'US') if attribute_present?("other_phone")
end
" self"由Rails正确处理? (因为我无法将其作为方法的参数传递)
答案 0 :(得分:1)
助手只应用于您的视图中使用的方法。
要回答你的问题,不,这不行。您无法在模型中使用视图助手。
如果在您使用它的每个模型中定义了“sanitize_phones_and_email”,它就可以正常工作(并且“self”将引用该模型的实例)。
如果您对干燥模型感兴趣,一种简单有效的方法(但不一定是最好的面向对象的方法)就是使用mixin。当您包含mixin时,该模块中的方法将自动成为类的实例方法。 “self”将引用它所包含的对象。
例如,在Rails 4中,您可以将这样的内容放在“concerns”文件夹中:
应用程序/模型/关切/ sanitzable.rb:
module Sanitizable
extend ActiveSupport::Concern
included do
before_save :sanitize_phones_and_email
end
def sanitize_phones_and_email
(self.email = email.downcase) if attribute_present?("email")
(self.work_phone = phony_normalize work_phone, :default_country_code => 'US') if attribute_present?("work_phone")
(self.mobile_phone = phony_normalize mobile_phone, :default_country_code => 'US') if attribute_present?("mobile_phone")
(self.fax_phone = phony_normalize fax_phone, :default_country_code => 'US') if attribute_present?("fax_phone")
(self.other_phone = phony_normalize other_phone, :default_country_code => 'US') if attribute_present?("other_phone")
end
end
应用程序/模型/ my_model.rb
class MyModel < ActiveRecord::Base
include Sanitizable
end