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)

Update

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

Ответ 1

Для 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

Ответ 2

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

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

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

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

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

Ответ 3

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

helper :my

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

и он будет загружать приложение/помощники/my_helper.rb и включает MyHelper

Enjoy

Ответ 4

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

Ответ 6

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

Ответ 7

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

# 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

Ответ 8

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