gpt4 book ai didi

ruby-on-rails - 在 Rails 中运行另一个方法之前调用一个方法

转载 作者:行者123 更新时间:2023-12-03 12:18:16 24 4
gpt4 key购买 nike

我有一个 Model ,其中有 method_1method_10 .我也有ModelObserver .
我想通知 ModelObserver在调用方法 1 到 method_9 之前,但不是 method_10 .

有没有一种 DRY 的方式来写这个,而不是在所有 9 种方法中重复 notify_observers(:after_something) ?

最佳答案

添加一个名为 monkey_patches.rb 的文件在 config/initializers目录。

class Object
def self.method_hook(*args)
options = args.extract_options!
return unless (options[:before].present? or options[:after].present?)
args.each do |method_name|
old_method = instance_method(method_name) rescue next

define_method(method_name) do |*args|
# invoke before callback
if options[:before].present?
options[:before].is_a?(Proc) ? options[:before].call(method_name, self):
send(options[:before], method_name)
end

# you can modify the code to call after callback
# only when the old method returns true etc..
old_method.bind(self).call(*args)

# invoke after callback
if options[:after].present?
options[:after].is_a?(Proc) ? options[:after].call(method_name, self):
send(options[:after], method_name)
end
end
end
end
end

该补丁使您能够添加 beforeafter类的实例方法的回调。钩子(Hook)可以是:
  • 接受一个参数的实例方法的名称
  • 接受两个参数的 lambda

  • 可以在同一个方法上注册多个钩子(Hook)。被钩住的方法应该在钩子(Hook)之前。

    例如:
    class Model < ActiveRecord::Base

    def method1
    end

    def method2
    end

    def method3
    end

    def method4
    end

    def update_cache
    end

    # instance method name as `after` callback parameter
    method_hook :method1, :method2, :after => :update_cache

    # lambda as `before` callback parameter
    method_hook :method1, :method2,
    :before => lambda{|name, record| p name;p record}

    # lambda as `after` callback parameter
    method_hook :method3, :method4,
    :after => lambda{|name, record|
    Model2.increment_counter(:post_count, record.model2_id)}

    end

    关于ruby-on-rails - 在 Rails 中运行另一个方法之前调用一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355704/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com