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

时间:2011-07-28 13:43:28

标签: ruby-on-rails ruby-on-rails-3 model actionmailer state-machine

我目前有许多电子邮件与模型中的各种状态相关联。 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

1 个答案:

答案 0 :(得分:1)

如何将您的电子邮件生成改为ActiveRecord::Oserver