【问题标题】:Identify which action is being called inside a model. Ruby on Rails确定在模型中调用了哪个动作。 Ruby on Rails
【发布时间】:2010-09-16 11:22:41
【问题描述】:

我如何知道是否从模型内部调用了创建或任何其他操作。基本上我正在做数据库日志记录,并想跟踪是否正在执行创建或其他操作。

为了进行日志记录,我使用了ActiveRecord::Observer 的概念。但是我无法确定用户是在创建还是在做其他事情。所以请告诉我rails为我们提供了一些方法来识别模型内部的动作。

提前致谢。

【问题讨论】:

  • 记录的目的是什么?

标签: ruby-on-rails ruby model action


【解决方案1】:

这种跟踪应该在Controller上执行。 观察者只能感知模型,并且应该只感知模型。

考虑从控制台更新对象的情况。 观察者将被触发,但您这里没有请求上下文。

【讨论】:

  • 感谢您提供额外的知识,但我想创建一个日志,正如我之前所说的那样,我有一个存储已执行操作的列。并且日志部分正在 Observer 中执行。
  • 这个,听西蒙娜。您无权访问模型中的请求数据是有原因的。
  • 我理解@Faisal,但这是情况的需要。我能做什么?
  • 我要做的就是忘记整个模型观察者的想法。在您的控制器(或 ApplicationController 以监控所有内容)上创建一个前/后过滤器,并创建一个特定的日志模型,该过滤器将用于记录操作。如果您需要记录正在创建的对象本身,则可以从过滤器切换到私有方法,只要您想记录任何内容并传递适当的参数,您就可以从控制器操作调用该方法。
【解决方案2】:

在应用程序中调用的任何操作都存储在 params[:action] 中,并且在模型中无法访问 params。 所以我认为你看不到模型调用了哪个动作。

谢谢,阿努霍

【讨论】:

  • 嘿,谢谢@Anubhaw。我知道那部分。但是 ActiveRecord::Observer 是一个 ActiveRecord 类,即类似于模型,可能有一些方法。
  • 嘿,您可以查看以下帖子m.onkey.org/2007/10/17/…,但这并不是您在帖子中发现的最佳方法。我对观察者一无所知。
【解决方案3】:

您可以使用 before_save 在模型保存时触发事件。要确定它是保存还是创建,您可以使用此方法new_record?,它会告诉您它是否是新实例。还可以知道哪些属性有changed

【讨论】:

【解决方案4】:

从架构的角度来看,不建议这样做,但这仅用于模型内部的低级别日志记录,不会造成任何伤害。这也是线程安全的解决方案。

ApplicationController 或只是单个控制器:

around_filter :store_remote_ip_in_thread

def store_remote_ip_in_thread
  begin
    Thread.current[:remote_ip] = request.remote_ip
    yield
  ensure
    Thread.current.delete :remote_ip
  end
end

用于检索的可重用模块:

module RemoteIpAware
  def current_remote_ip
    Thread.current[:remote_ip] || '-'
  end
end

model/mailer/lib 类中的某处:

 include RemoteIpAware
 ...
 #use current_remote_ip method anywhere

请记住,我是凭记忆写的.. 语法可能不对 ;) 在您的情况下,您可以保存 params[:action] :controller name 等而不是远程 IP。

【讨论】:

  • 请不要那样做。线程不是类似 PHP 的全局变量,不应该以这种方式使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多