1

我仍在学习 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

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

4

2 回答 2

0

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

于 2013-10-08T20:38:33.867 回答
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 了。这可能会解决您的挑战。

于 2013-10-08T20:54:32.957 回答