РЕШЕНО. См. примечание 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».
pretty_phone
вызывается как метод класса? Если вы определили его как метод экземпляра, попробуйте определить его как метод класса (self.pretty_phone
) и посмотрите, работает ли это? - person Zabba   schedule 20.02.2011