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

时间:2013-10-08 20:13:20

标签: ruby-on-rails ruby devise

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

我希望在用户将故障单的状态更改为已关闭时触发电子邮件。

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

电子邮件将是一个小通知,注意# _ 的票证已关闭。

我有点绊倒了这段代码应该去的地方。控制器中没有新代码,但我在故障单模型中添加了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

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

2 个答案:

答案 0 :(得分:0)

非常确定,但我认为您无法访问模型中的current_user。即使你可以,我可以建议一个替代方案。相反,我会使用closed_by_id属性,即current_user's ID。这样您还可以跟踪关闭票证的人员。从这里,您可以检查故障单是否已关闭以及故障单ID的创建者是否等于closed_by_id

答案 1 :(得分:0)

正如你所提到的,你有一个创造者和一个'更接近'(或任何你想称呼该用户)。在您的用户模型中,您希望拥有以下内容:

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。这可能解决了你的挑战。