Ruby on rails Rails观察者,如何确定是什么触发了
我的观察者设置如下:Ruby on rails Rails观察者,如何确定是什么触发了,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我的观察者设置如下: class FeedObserver < ActiveRecord::Observer observe :permission def after_destroy(record) Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy XXXXXXXXXXXXXXXXXXXXXXXXXXX' Rails.logger.info rec
class FeedObserver < ActiveRecord::Observer
observe :permission
def after_destroy(record)
Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy XXXXXXXXXXXXXXXXXXXXXXXXXXX'
Rails.logger.info record.inspect
Rails.logger.info record.class.name
Rails.logger.info record.class
Rails.logger.info 'XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy XXXXXXXXXXXXXXXXXXXXXXXXXXX'
end
end
class FeedObserver
在日志中,这看起来有点像:
XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy XXXXXXXXXXXXXXXXXXXXXXXXXXX
#<Permission id: 52, project_id: 12, role_id: 2, user_id: 1>
Permission
Permission
XXXXXXXXXXXXXXXXXXXXXXXXX Feed Observer - after_destroy XXXXXXXXXXXXXXXXXXXXXXXXXXX
xxxxxxxxxxxxxxxxxxxxxxxx馈送观察员-销毁xxxxxxxxxxxxxxxxxxxxxxxx后
#
许可
许可
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX馈送观察员-销毁XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX后
问题在于,在我的权限控制器中,有两种方法可以删除权限对象:destory和leaveproject
在观察器中,我如何确定调用了哪个方法导致调用了Feed观察器
谢谢嗯,你不知道,但我不认为这应该很难找到 销毁后,如果您遵循约定,它应该位于
提要(u controller.rb
ie提要控制器#destroy
,或者在:dependent=>:destroy
关联的情况下,它应该位于销毁操作中的关联控制器中
另一种简单的方法是使用rubyraise
方法来引发一个虚拟错误,然后遍历堆栈跟踪Try Kernel#caller,它将在执行堆栈的该点返回回溯。试着这样做:
def after_destroy(record)
Rails.logger.info caller.join("\n")
...
您将获得一些输出,但如果跳过rails框架内容,您应该可以找到控制器代码。如果这对您来说非常重要,一个更简单的解决方案可能是在模型类上创建您自己的方法来调用destroy并直接执行任何清理内容。然后,此函数可以接收有关调用方的其他信息。类似这样的方法可能会奏效:
class Work < ActiveRecord::Base
def destroy_work(from)
self.destroy
Rails.logger.info "The work with the id of #{id} got destroyed by #{from}"
end
end
课堂作业
通过不依赖花哨的元编程(如检查调用堆栈),您可以使您的程序更具弹性,也更易于理解。这同样适用于回调,甚至更适用于外部观察者类。在原始模型中,通常只有很少的回调存在的痕迹(如果有的话)。这使得分析行为非常复杂且容易出错,因为您很容易忽略业务逻辑中潜在的重要部分。通过实现直接函数,您可以使您的逻辑更容易理解,因为它遵循一条简单的直线
如果有疑问,总是最愚蠢和最简单的事情,可能会工作。调试代码通常要比编写代码聪明两倍。因此,做一些聪明的事情可能会导致以后的代码无法维护,因为人们不够聪明,无法理解您的逻辑流