【问题标题】:ActionMailer method returning nilActionMailer 方法返回 nil
【发布时间】:2015-01-15 10:19:28
【问题描述】:

我为 Rails 应用程序创建了一个简单的票务系统。我现在需要在创建新票证时发送一封电子邮件。因此,我创建了以下 Mailer 类:

app/mailers/application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  default to: Proc.new { "admin@domain" },
  from: 'admin@domain'

  def initialize(arg0, arg1)
    @base_url = 'http://app.domain'
  end

end

app/mailers/ticket_mailer.rb

class TicketMailer < ApplicationMailer

  def new_ticket(ticket)
    @ticket = ticket
    @url  = @base_url + '/tickets/' + @ticket.id.to_s
    mail(subject: "New Ticket: #{@ticket.title}")
  end
end

并修改了Ticket模型:

class Ticket < ActiveRecord::Base
  belongs_to :user
  belongs_to :ticket_status
  belongs_to :ticket_type

  has_many   :ticket_follow_ups

  after_create :send_ticket_mail

  def send_ticket_mail()
    TicketMailer.new_ticket(self).deliver
  end
end

当我尝试创建新票时,我得到以下异常:

NoMethodError(未定义方法deliver' for nil:NilClass):
app/models/ticket.rb:20:in
send_ticket_mail'
app/controllers/tickets_controller.rb:21:in `create'

我尝试直接从控制器调用该方法,但结果是一样的。我错过了什么?

【问题讨论】:

  • TicketMailer.new.new_ticket(self).deliver 试试这个

标签: ruby-on-rails actionmailer


【解决方案1】:

你可以试试这个

  def send_ticket_mail()
    TicketMailer.new.new_ticket(self).deliver
   end

【讨论】:

  • 我得到一个不同的错误:“NoMethodError(私有方法new' called for TicketMailer:Class): app/models/ticket.rb:21:in send_ticket_mail' app/controllers/tickets_controller.rb:21:in `create'”
【解决方案2】:

基本上这个问题是由ApplicationMailer类中的initialized方法引起的。如果将其删除并且 url 以常量存储,则事情会按预期运行:

class ApplicationMailer < ActionMailer::Base
  default to: Proc.new { "admin@domain" },
  from: 'admin@domain'

  BASE_URL = 'http://app.domain'
end

当然,TicketMailer 类必须修改为使用该常量。

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多