模型属性更新上的条件电子邮件触发器(Devise & Rails)



我还在学习Rails,并使用Devise。 目前,我正在研究一个错误/票证记录系统。 我在这个系统中,我们有由用户创建的票证,分配给另一个用户,所有可以查看它的用户可以在其上发布回复。

我想在用户将工单的状态更改为已关闭时触发电子邮件。

但是,如果您是(票证的(创建者并且您关闭了它,则您不需要电子邮件,但您希望通过电子邮件将其分配给的用户。 同样,如果您是受让人并且关闭了它,则您不想发送电子邮件,但确实希望向创建者发送电子邮件。 如果您既不是创建者也不是受让人,您仍然不需要电子邮件,但您确实希望向其他两个发送电子邮件。

该电子邮件将是一条小通知,指出票证#_已关闭。

我对这段代码应该去哪里有点绊倒。 控制器中没有新代码,但我在工单模型中添加了before_update:email_update。

def email_update 
  #status field is changed
  if status_changed? && status.description == "Closed"
   if(current_user != assigned_to)
      UserMailer.new_ticket_admin(assigned_to, self).deliver
    end
    if(current_user != user)
      UserMailer.new_ticket_admin(user, self).deliver
    end
  end       
end

但是,在其中一个模型中访问当前用户这不是不好的做法吗? 什么是更好的方法?

很确定,但我认为您无法访问模型中的current_user。即使你可以,我也可以建议一个替代方案。相反,我会使用 closed_by_id 属性,其中它是current_user's ID。通过这种方式,您还可以跟踪谁关闭了工单。从这里,您可以检查工单是否已关闭,以及工单ID的创建者是否等于closed_by_id

正如你提到的,你有一个创建者和一个"更接近者"(或任何你想称呼该用户的东西(。在你的用户模型中,你希望有这样的东西:

class Ticket < ActiveRecord::Base
  belongs_to :requested_by, class_name: 'User' # foreign_key requested_by_id
  belongs_to :closed_by, class_name: 'User' # foreign_key closed_by_id
  def close(user)
    self.closed_by = user
    self.save
  end
  # bonus method
  def closed?
    closed_by?
  end
end
def User < ActiveRecord::Base
  has_many :tickets, foreign_key: 'requested_by_id'
  has_many :closed_tickets, foreign_key: 'closed_by_id'
end

对于您的控制器,如下所示:

class TicketController < ApplicationController
  def create
    @ticket = current_user.tickets.build params[:ticket]
  end
  def close
    @ticket = Ticket.find(params[:id])
    @ticket.close current_user
  end
end

这样,就不需要在模型中设置current_user。这可能会解决你的指控。

最新更新