我还在学习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
但是,在其中一个模型中访问当前用户是不是不错的做法?什么是更好的方法?
答案 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。这可能解决了你的挑战。