Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 禁用ActiveModel回调_Ruby On Rails_Ruby_Callback_Activemodel - Fatal编程技术网

Ruby on rails 禁用ActiveModel回调

Ruby on rails 禁用ActiveModel回调,ruby-on-rails,ruby,callback,activemodel,Ruby On Rails,Ruby,Callback,Activemodel,我出版了,但我不完全确定这是做这种事情最漂亮的方式 Mongoid::Timestamps添加保存前回调,用于更新updated_at字段。假设在某些情况下我不希望出现这种情况,我禁用回调,如下所示: class User # I'm using Mongoid, but this should work for anything based on # ActiveModel. include Mongoid::Document include Mongoid::Timesta

我出版了,但我不完全确定这是做这种事情最漂亮的方式

Mongoid::Timestamps
添加保存前回调,用于更新
updated_at
字段。假设在某些情况下我不希望出现这种情况,我禁用回调,如下所示:

class User
  # I'm using Mongoid, but this should work for anything based on 
  # ActiveModel.
  include Mongoid::Document
  include Mongoid::Timestamps

  def sneaky_update(attributes)
    User.skip_callback(:save, :before, :set_updated_at)
    User.update_attributes(attributes)
    User.set_callback(:save, :before, :set_updated_at)
  end

end

调用
skip\u callback
,然后调用
set\u callback
,以再次设置已删除的回调是否是一个坏主意?你会怎么做?:)

例如,您可以使用send在保存回调和验证之前跳过

user = User.new(:name=>'test')
user.send(:create_without_callbacks)
这个怎么样

module Mongoid
  module Timestamps
    attr_accessor :skip_updated_at

    def set_updated_at_new
      unless self.skip_updated_at
        set_updated_at_org
      end
    end

    alias set_updated_at_org set_updated_at
    alias set_updated_at set_updated_at_new
  end
end

class User
  # I'm using Mongoid, but this should work for anything based on 
  # ActiveModel.
  include Mongoid::Document
  include Mongoid::Timestamps

  def sneaky_update(attributes)
    self.skip_updated_at = true
    User.update_attributes(attributes)
    self.skip_updated_at = false
  end

end

您当前的解决方案似乎是“危险的”,因为如果更新引发异常,那么回调就不会被放回原位,这可能会严重破坏它之后的任何请求。自我修改代码是一个非常糟糕的主意,如果它对其他线程有持久的副作用,这有点像使用全局函数


但我似乎有问题,我一直在四处寻找解决方案,而你的解决方案是迄今为止我能找到的最好的。我认为Rails可能需要为回调模块添加一种更优雅的方法。

您能更具体地回答您的问题吗?Stackoverflow并不是真的为博客中心提供反馈。对不起,我补充了我的问题描述。我不是想征求关于博客文章的反馈,而是想征求关于我所写但不确定的解决方案的反馈。:)你能给我看一下
:创建没有回调的\u吗?我怀疑这就是魔法发生的地方。:)我的理解是,这将调用基类上的私有方法。这是一个解决方案,但我更喜欢禁用回调,而不是更改它调用的方法。:)