我尝试过:
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
对于Rails5,我将url助手包含在我的mailer文件中:
# 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
这样做破坏了我的其他路线。
# 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-操作中的url mailer视图
我遇到了同样的问题,但由于存在问题,我无法在代码中使用任何url帮助程序,即使直接使用Rails.application.routes.url_helpers.administrator_beverages_url
,我也会收到以下错误:
undefined method `administrator_beverages_url' for #<Module:0x00000002167158> (NoMethodError)
即使因为这个错误而无法使用rails控制台,我发现解决这个问题的唯一方法就是在我的Concern 中使用这个代码
module SimpleBackend
extend ActiveSupport::Concern
Rails.application.reload_routes! #this did the trick
.....
问题是Rails.application.routes.url_helpers在初始化时为空。我不知道使用它对性能的影响,但在我的情况下,这是一个小应用程序,我可以接受。
在邮件中添加
helper :my
或者你需要的助手
并且它将加载app/helpers/my_helper.rb&包括MyHelper
享受
铁轨路线助手位于Rails.application.routes.url_helpers
中。你应该能够include Rails.application.routes.url_helpers
是你班的佼佼者,尽管我还没有测试过这个
我在处理一个新添加的路由时遇到了这个问题,该路由在我的Mailer中似乎不可用。我的问题是我需要重新启动所有的工人,这样他们就会选择新添加的路线。只需将脚注留在这里,以防有人遇到同样的问题,如果你不知道这会发生,那么解决起来可能会很棘手。
请看一下这个博客,它解释了如何以正确的方式使用Rails.application.routes.url_helpers。
http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/
您需要使用my_helper_url