Rails - не могу понять, куда поместить очень простой вспомогательный метод форматирования строк

РЕШЕНО. См. примечание 2 и 3.


Наверное, я просто не понимаю классы в rails 3 + ruby ​​1.9.2...

Мы используем actionmailer вместе с delayedjob. Все работает нормально, ЗА ИСКЛЮЧЕНИЕМ, я просто пытаюсь красиво оформить некоторые телефонные номера и пытаюсь ГДЕ-НИБУДЬ поместить простой метод pretty_phone (для форматирования телефонного номера), который не выдает ошибку:

Class#sample_email failed with NoMethodError: undefined method `pretty_phone'

Я пробовал это в model_helper.rb, application_helper.rb и в классе, который, я думаю, является моделью для нашей электронной почты foo_mailer.rb (FooMailer ‹ ActionMailer::Base)

Настройка нашего проекта такова:

app
  controllers
    widgets_controller.rb
  helpers
    application_helper.rb
    widgets_helper.rb
  mailer
    foo_mailer.rb   ***
  models
    widget.rb
  views
    widget
      (usual edit,show, etc views)
    foo_mailer
      sample_email.html.haml  ***

Это простой метод, который я пытаюсь добавить:

    # num is a string, always in format 12223334444 we want (222)333-4444
  def pretty_phone(num)
     return "(" + num[1,3] + ")" + num[4,3] + "-" + num[7,4]
  end

foo_mailer.rb очень прост:

class FooMailer < ActionMailer::Base

  helper :application         **** THIS ALMOST MAKES IT WORK SEE NOTE 2
  include ApplicationHelper   **** AND THIS ALSO IS REQUIRED NOTE 3

  default :from => "Support <[email protected]>"

  def sample_email(thewidget)
    @widget = thewidget

    send_to = @widget.contact_email
    if !send_to.blank?
      mail :to => send_to,
         :subject => "alert regarding #{pretty_phone(@widget.userphone)}"
    end
  end
end

и ниже в нашем представлении для электронной почты мы также используем #{pretty_phone(@widget.userphone)}

Мне очень хотелось бы понять, почему я не могу поместить этот хелпер в application_helper или даже в foo_mailer.rb и заставить его работать — и куда он ДОЛЖЕН идти?

(В настоящее время у меня есть помощник в application_help.rb, и ВСЕ наши виджеты erb могут использовать его нормально... это просто представление электронной почты и/или файл класса foo_mailer.rb, которые вызывают ошибку.)


ЗАМЕТКА 2

добавив helper :application в начало foo_mailer.rb, ТЕПЕРЬ вспомогательный метод pretty_phone() в application_help.rb работает в представлениях foo_mailer, но НЕ в самом foo_mailer.rb. Так, например, если я хочу использовать pretty_phone() в строке темы письма, это не сработает. Но в реальных письмах (просмотрах) это работает.

Мне это кажется странным - есть предложения?


ПРИМЕЧАНИЕ 3. Необходимо было добавить «include» И «helper».


person jpw    schedule 20.02.2011    source источник
comment
Вы пытались потребовать помощника в своем actionmailer? Я думаю, что это не делается автоматически, как в представлениях.   -  person Miquel    schedule 20.02.2011
comment
как я это сделал? Мне никогда не приходилось этого делать раньше (вроде новичка в рельсах).   -  person jpw    schedule 20.02.2011
comment
Похоже, pretty_phone вызывается как метод класса? Если вы определили его как метод экземпляра, попробуйте определить его как метод класса (self.pretty_phone) и посмотрите, работает ли это?   -  person Zabba    schedule 20.02.2011
comment
нет, это не обман, поскольку целью (и решением) было использование существующего вспомогательного метода приложения как в модели, так и в представлении actionmalier.   -  person jpw    schedule 27.04.2015


Ответы (2)


Где разместить вспомогательные методы для представлений ActionMailer? я думаю, это именно то, что вам нужно.

person Petya petrov    schedule 20.02.2011
comment
Хм. спасибо но нет. получить точно такую ​​же ошибку. перезапустил мой локальный сервер и отложил задание. поместите mailer_helper.rb в папку моделей (хотя я использовал модуль определения MailerHelper (не класс), так как это требуется там). А затем добавил помощника MailerHelper в качестве первой строки файла foo_mailer.rb. Та же ошибка. - person jpw; 20.02.2011
comment
Почему вы помещаете MailerHelper в папку моделей, а не в папку помощников? - person Andrew Marshall; 20.02.2011

ответ публикуется как часть вопроса. спасибо всем тем, чьи комментарии привели к окончательному пониманию этого. Я пытаюсь «пометить» этот вопрос как ответ, чтобы люди не чувствовали, что им нужно дать другой ответ, но кто-то удалил мой предыдущий ответ. поэтому я снова добавляю это, чтобы через день или два система позволила мне отметить этот вопрос как ответ.

person jpw    schedule 23.02.2011