ruby gem -如何使我的gem代码可用于所有控制器,并使其可执行,而无需在控制器中添加任何代码行



我一直在做一个实验性的宝石。这个想法是,对于每个方法调用,我需要打印一些东西。我怎样才能实现它

class MyGem
def self.put_text
puts 'execution in progess'
end
end

这将是我的gem代码。现在如果我要在控制器中调用这个我就输入

class SampleController < ApplicationController
def method_one
MyGem.put_text
do_something
end
def method_two
MyGem.put_text
do_something_else
end
end

但是我想要一种有效的方法来做到这一点,比如将Gem添加到Gemfile并配置在某个地方或类似的东西,以便MyGem。对于所有控制器中的所有方法,Put_text将被自动调用。

Thanks in advance

Rails有过滤器的概念,您可以利用它来实现这一点。你可以在Rails filters

找到详细信息有三种类型的过滤器:

  • 在<<li>/gh>

可以在之前使用或者在过滤器周围使用

module Filters
def around_all
puts "around filter, before action"
yield
puts "around filter, after action"
end
def before_all
puts "before filter, before action"
end
def after_all
puts "after filter, after action"
end
end
ActionController::Base.include(Filters)
ActionController::Base.around_action :around_all
ActionController::Base.before_action :before_all
ActionController::Base.after_action :after_all

这将输出,除了通常的日志输出,类似于以下内容

Started GET "/somethings" for ::1 at 2023-01-14 16:15:40 +0100
Processing by SometingsController#index as HTML 
around filter, before action 
before filter, before action
after filter, after action 
around filter, after action 
Completed 200 OK

如果你需要在动作前后访问局部变量或状态,例如计时或对象计数,Around过滤器是很好的。

注意:过滤器周围的有一个yield语句,不要忘记这一点,否则你的操作将不会被调用。

相关内容

  • 没有找到相关文章

最新更新