Rails用self调用方法

时间:2014-06-10 17:06:28

标签: ruby-on-rails-4 ruby-on-rails-4.1

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正确处理? (因为我无法将其作为方法的参数传递)

1 个答案:

答案 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