【问题标题】:Rails - URL helpers not working in mailersRails - URL 帮助程序在邮件程序中不起作用
【发布时间】:2013-07-21 18:03:41
【问题描述】:

我试过了:

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

【问题讨论】:

  • 请接受对您有帮助的答案之一。 :)

标签: ruby-on-rails actionmailer urlhelper


【解决方案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

【讨论】:

  • 此解决方案可能会导致问题。具体来说,当部署在 heroku 上时,它可以在其他模板上破坏 link_to。我想这是rails中的一个错误,但可能需要不同的解决方法,就像我一样。参考:stackoverflow.com/questions/34573087/…
  • @gdxn96 当您在生产模式下启动服务器时会出现问题(heroku 所做的)。如果您将 include Rails.application.routes.url_helpers within 放在 InvoiceMailer 类中,则不会发生这种情况
【解决方案2】:

这样做打破了我的其他路线。

# 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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但有一点担心,即使直接使用Rails.application.routes.url_helpers.administrator_beverages_url,我也无法在我的代码中使用任何 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 在初始化时是空的。我不知道使用它对性能的影响,但就我而言,这是一个小型应用程序,我可以接受。

    【讨论】:

      【解决方案4】:

      在邮件中添加

      helper :my
      

      或您需要的助手

      它会加载 app/helpers/my_helper.rb 并包含 MyHelper

      享受

      【讨论】:

      • 谢谢,但我正在尝试使用 Rails 路由助手。我想你是在app/helpers 中谈论助手
      【解决方案5】:

      rails 路由助手位于Rails.application.routes.url_helpers。你应该可以把 include Rails.application.routes.url_helpers 在你的班级顶部,虽然我没有测试过这个

      【讨论】:

      • 我试过这个,很奇怪。更奇怪的是,如果我使用 url helper,环境不会加载,但我可以:1. 注释行,2. 启动服务器,例如,3. 取消注释行 4. 它可以工作。但这不适用于真实环境。作为临时解决方案,我使用的是静态网址:www.blahblahblah.com/...
      【解决方案6】:

      我在使用新添加的路由时遇到了这个问题,该路由似乎在我的 Mailer 中不可用。我的问题是我需要重新启动所有工人,所以他们会选择新添加的路线。把这个脚注留在这里,以防有人遇到同样的问题,如果你不知道这是怎么回事,解决起来可能会很棘手。

      【讨论】:

        【解决方案7】:

        请查看此博客,该博客解释了如何以正确的方式使用 Rails.application.routes.url_helpers。

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

        【讨论】:

          【解决方案8】:

          您需要使用my_helper_url

          【讨论】:

          • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
          • 这个评论是@michaelb958 吗?
          • 我是通过Low Quality Posts queue 来到这里的,我认为这个答案不够相当,并建议删除该罐头评论。您无需同意这一点;你可以编辑你的帖子来改进它,或者其他什么。
          • 所以下次可能会阅读答案而不是复制和粘贴默认消息。盖伊调用了错误的方法,仅此而已。不需要更多解释。
          • 我不是 Rails 专家,但我认为 (OP) 我正在使用帮助程序的 _url 形式意味着他正在使用 my_helper_url。没有给出修订时间戳,因此信息要么随问题一起提供,要么在发布后不到 5 分钟内被编辑。因此,这个答案(半小时前)并没有真正帮助。 (在这里可以不同意。)
          猜你喜欢
          • 2012-12-29
          • 2013-02-20
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多