将邮件程序包含在有状态模型中或将其保留在控制器中

问题描述 投票:0回答:1

我目前有许多电子邮件与模型中的各种状态相关联。 IE,如果状态从“待定”变为“已确认”,则会生成电子邮件。

我现在正在重新思考电子邮件生成应该在模型中还是在控制器中?我一直在更新我的邮件程序,以便它们不对称地执行,这意味着替换我以前的代码,它将数据库支持的对象作为参数传递到我的邮件程序中,而是传递记录标识符,以便以后查找它们。

从模型中执行此操作的问题是,在调用方法中的所有步骤之前,记录实际上不会保存。因此,如果他们依赖于任何步骤等,它会破坏我的邮件。

我是否应该将所有这些全部移出模型?或者是否有其他方法可以确保在执行邮件之前保存?

  event :confirm do
    transitions :to => :confirmed, :from => :pending, :on_transition => :do_confirm
  end

  def do_confirm(finished_at = Time.now)
      self.confirmed_at = finished_at
      UserMailer.confirmed_booking_request(self).deliver # old way, doesn't matter if record is saved or not
      UserMailer.confirmed_booking_request(self.id).deliver #doesn't work since the record hasn't been saved and confirmed_at is nil
  end

或者我应该在我的控制器内进行电子邮件生成

  if @confirmation.save
    @confirmation.booking.reject!
    UserMailer.confirmed_booking_request(@confirmation.id).deliver #previously did this all from the above method
    redirect_to space_path(@confirmation.booking.space)
  end
ruby-on-rails ruby-on-rails-3 model actionmailer state-machine
1个回答
1
投票

如何将您的电子邮件生成放在ActiveRecord::Oserver中呢?

© www.soinside.com 2019 - 2024. All rights reserved.