Rails - помощники URL не работают в почтовых программах

Я старался:

class MyMailer
  def routes
    Rails.application.routes.url_helpers
  end

  def my_mail
    @my_route = routes.my_helper
    ... code omitted 
  end

Также внутри почтовой программы:

include Rails.application.routes.url_helpers

def my_mail
  @my_route = my_helper

Кроме того, простой способ в шаблоне почтовой программы:

= link_to 'asd', my_helper

Но затем, когда я пытаюсь запустить консоль, я получаю:

undefined method `my_helper' for #<Module:0x007f9252e39b80> (NoMethodError)

Обновлять

Я использую форму помощника _url, т.е. my_helper_url


person sites    schedule 21.07.2013    source источник
comment
Пожалуйста, примите один из ответов, которые помогли вам. :)   -  person Constant Meiring    schedule 11.09.2017


Ответы (8)


Для Rails 5 я включил помощники URL в свой файл почтовой программы:

# mailers/invoice_mailer.rb
include Rails.application.routes.url_helpers

class InvoiceMailer < ApplicationMailer
    def send_mail(invoice)
        @invoice = invoice
        mail(to: @invoice.client.email, subject: "Invoice Test")
    end
end
person Constant Meiring    schedule 30.01.2017
comment
Это решение может привести к проблемам. В частности, он может сломать link_to на других шаблонах при развертывании на героку. Я предполагаю, что это ошибка в рельсах, но может потребоваться другой обходной путь, как это было со мной. Ссылка: stackoverflow. ком/вопросы/34573087/ - person gdxn96; 29.09.2018
comment
@gdxn96 gdxn96 проблема возникает, когда вы запускаете сервер в рабочем режиме (что делает героку). Этого не произойдет, если вы поместите include Rails.application.routes.url_helpers внутри класса InvoiceMailer - person Raphael Pr; 13.09.2019

Я столкнулся с той же проблемой, но с проблемой, я не смог использовать ни один из вспомогательных URL-адресов в своем коде, даже используя напрямую Rails.application.routes.url_helpers.administrator_beverages_url, я получал эту ошибку:

undefined method `administrator_beverages_url' for #<Module:0x00000002167158> (NoMethodError)

даже не смог использовать консоль rails из-за этой ошибки. Единственный способ, который я нашел для решения этой проблемы, - использовать этот код в моей проблеме.

module SimpleBackend
    extend ActiveSupport::Concern
    Rails.application.reload_routes! #this did the trick
.....

Проблема заключалась в том, что Rails.application.routes.url_helpers был пуст на момент инициализации. Я не знаю, как это повлияет на производительность, но в моем случае это небольшое приложение, и я могу выдержать пулю.

person Dranes    schedule 22.11.2013

Это сломало другие мои маршруты.

# mailers/invoice_mailer.rb
include Rails.application.routes.url_helpers

Делать это неправильно, это сломает приложение, так как маршруты перезагружаются, а маршруты будут недоступны, если они перезагружаются.

module SimpleBackend
    extend ActiveSupport::Concern
    Rails.application.reload_routes!

Правильный ответ — использовать методы *_url, а не *_path в шаблонах электронной почты, как описано ниже в документации по Rails.

https://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views

person omair azam    schedule 01.10.2018

В почтовике добавить

helper :my

или помощник, который вам нужен

и он загрузит app/helpers/my_helper.rb и включает MyHelper

Наслаждаться

person obenda    schedule 21.07.2013
comment
спасибо, но я пытаюсь использовать помощники маршрутов Rails. Я полагаю, вы говорите о помощниках в app/helpers - person sites; 21.07.2013

Помощники маршрута rails находятся в Rails.application.routes.url_helpers. Вы должны просто поставить include Rails.application.routes.url_helpers на вершину своего класса, хотя я не проверял это

person John Hinnegan    schedule 21.07.2013
comment
Я пробовал это, это странно. Что еще более странно, так это то, что среда не загружается, если я использую url helper, но я могу: 1. строку комментария, 2. например, запустить сервер, 3. раскомментировать строку 4. это работает. Но это не будет работать для реальной среды. В качестве временного решения я использую статический URL-адрес: www.blahblahblah.com/... - person sites; 22.07.2013

Я столкнулся с этой проблемой во время работы с недавно добавленным маршрутом, который, казалось, был недоступен в моем Mailer. Моя проблема заключалась в том, что мне нужно было перезапустить всех рабочих, чтобы они подобрали новый добавленный маршрут. Просто оставьте эту сноску здесь на тот случай, если кто-то столкнется с той же проблемой. Если вы не знаете, что это происходит, решить ее может быть сложно.

person rii    schedule 12.01.2016

Пожалуйста, взгляните на этот блог, в котором объясняется, как правильно использовать Rails.application.routes.url_helpers.

http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/

person jake    schedule 24.11.2014

Вам нужно использовать my_helper_url

person Mike Szyndel    schedule 21.07.2013
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person michaelb958--GoFundMonica; 22.07.2013
comment
WTF это комментарий @ michaelb958 ? - person Mike Szyndel; 22.07.2013
comment
Я попал сюда через очередь сообщений низкого качества и решил, что совсем достаточно в этом ответе, и рекомендуется удалить этот готовый комментарий. Вы не обязаны соглашаться с этим; вы можете отредактировать свой пост, чтобы улучшить его или что-то в этом роде. - person michaelb958--GoFundMonica; 22.07.2013
comment
Так что в следующий раз, возможно, прочитайте ответ, а не копируйте и вставляйте сообщение по умолчанию. Парень вызывает неправильный метод, вот и все. Не требует дополнительных объяснений. - person Mike Szyndel; 22.07.2013
comment
Я не эксперт по Rails, но я думаю, что (OP) я использую форму _url помощника означает, что он использует my_helper_url. Временная метка редакции не указана, поэтому информация либо была отправлена ​​вместе с вопросом, либо была отредактирована менее чем через 5 минут после публикации. Следовательно, этот ответ (полчаса назад) не очень помогает. (Здесь можно не соглашаться.) - person michaelb958--GoFundMonica; 22.07.2013
comment
Да, извините, я разозлился. В любом случае, я уже понял, что если человек ГОВОРИТ, что у него есть что-то в коде, это не значит, что он это делает, пока код не будет вставлен сюда. И в вставленном коде я не вижу формы _url... ;) - person Mike Szyndel; 22.07.2013
comment
хе-хе, я не видел здесь драки. - person sites; 22.07.2013
comment
О, @juanpastas, раз ты здесь, можешь подтвердить мои подозрения? И если я не прав, напишите ГДЕ эта ошибка? - person Mike Szyndel; 22.07.2013
comment
при попытке запустить консоль или сервер, то есть при загрузке среды rails. - person sites; 22.07.2013
comment
Я могу использовать помощника при изменении кода во время выполнения... Я не знаю, почему это происходит - person sites; 22.07.2013
comment
а можно полный лог? - person Mike Szyndel; 22.07.2013