Rails вызывает метод с самим собой

Рельсы 4.1 Руби 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

Будет ли «я» правильно обрабатываться Rails? (поскольку я не могу передать его в качестве аргумента методу)


person EastsideDev    schedule 10.06.2014    source источник
comment
Пример прямо здесь, в TFM: guides.rubyonrails.org/ Но я не Не думаю, что вы имели в виду application_helper.rb.   -  person Dave Schweisguth    schedule 10.06.2014
comment
Я имею в виду application_helper.rb. Я уже делаю то, на что указывает ваша ссылка. Я заинтересован в том, чтобы высушить его, так как я не хочу повторяться в каждой модели. Я думаю, нет чистого способа сделать это   -  person EastsideDev    schedule 11.06.2014


Ответы (1)


Помощники следует использовать только для методов, которые будут использоваться в ваших представлениях.

Отвечая на ваш вопрос, нет, это не сработает. Вы не можете использовать помощники представления в своих моделях.

Если бы «sanitize_phones_and_email» был определен в каждой модели, где вы его используете, он бы работал нормально (и «self» относился бы к экземпляру этой модели).

Если вы заинтересованы в DRY'ировании ваших моделей, то простым и эффективным способом (но не обязательно лучшим объектно-ориентированным подходом) является использование миксина. Когда вы включаете миксин, методы в этом модуле автоматически становятся методами экземпляра класса. "self" будет ссылаться на объект, в который он был включен.

Например, в Rails 4 вы можете поместить что-то подобное в свои "задачи" папка:

приложение/модели/проблемы/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
person Joe Edgar    schedule 10.06.2014