Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails观察者,如何确定是什么触发了_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

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
关联的情况下,它应该位于销毁操作中的关联控制器中

另一种简单的方法是使用ruby
raise
方法来引发一个虚拟错误,然后遍历堆栈跟踪

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
课堂作业
通过不依赖花哨的元编程(如检查调用堆栈),您可以使您的程序更具弹性,也更易于理解。这同样适用于回调,甚至更适用于外部观察者类。在原始模型中,通常只有很少的回调存在的痕迹(如果有的话)。这使得分析行为非常复杂且容易出错,因为您很容易忽略业务逻辑中潜在的重要部分。通过实现直接函数,您可以使您的逻辑更容易理解,因为它遵循一条简单的直线

如果有疑问,总是最愚蠢和最简单的事情,可能会工作。调试代码通常要比编写代码聪明两倍。因此,做一些聪明的事情可能会导致以后的代码无法维护,因为人们不够聪明,无法理解您的逻辑流