Ruby on rails 注入gem';父应用程序模型中筛选器之前的
我试图看看是否有可能在父应用程序模型中注入或执行gem的before过滤器。 例子: Gem的Ruby on rails 注入gem';父应用程序模型中筛选器之前的,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图看看是否有可能在父应用程序模型中注入或执行gem的before过滤器。 例子: Gem的Gem/app/controllers/test/application\u controller.rb: module Test class ApplicationController < ActionController::Base before_update :foo def foo puts 'test' end end end class
Gem/app/controllers/test/application\u controller.rb
:
module Test
class ApplicationController < ActionController::Base
before_update :foo
def foo
puts 'test'
end
end
end
class Business < ApplicationRecord
# should call foo before creating the record
# and execute the puts statement
end
当应用程序执行Business.create(params)
时,Business
模型应该从gem调用方法foo
,并执行put语句。目前,我无法进行此调用,b/cfoo
在create
方法之前没有执行。因此,我正在寻找一种方法来尝试和测试这一点。谢谢
编辑2:
这里的用例是:父应用程序中的一些模型包含列由
创建的列和由
更新的列。我们希望将这些列更新为对特定模型执行操作的用户UID。我知道我可以在家长应用程序中更新或创建之前执行,但我们希望将这些操作放在gem中,以便我们的多个应用程序可以使用它。我们正在使用的gem是我们编写的一个通用gem,它集成在我们的所有应用程序中。另外,我知道有很多优点,比如审计跟踪,但我们希望它更简单。
除了在具有多个模型的gem中使用它之外,这里的代码片段的想法基本相同。我希望这能让事情变得更清楚。谢谢 我决定用一个新的gem和一个干净的rails应用程序来测试它
Gem
Gemfile
源代码'https://rubygems.org'
宝石
gem‘activerecord’
lib/application_record.rb
class ApplicationRecord
Rails应用程序
app/models/business.rb
class Business < ApplicationRecord
end
类业务
在rails控制台中,我调用Business.create
,我得到的第一个输出是test
欢迎使用SO!如果您发布上面显示的代码的结果,这将非常有用。:foo
是否在业务上被调用。创建?你有错误吗?您是否正在使用任何调试(例如调用binding.pry:foo)我在@chiperifc进行了更新。感谢you@MavinaLim您是否覆盖Business
类中的默认create
方法?我想这只是说明性的,但会产生误导。使用名为create
的方法时要小心-这是默认的活动记录方法-我会尽量避免。如果您必须使用create
方法,请务必对其调用“super”。我强烈建议您重命名该方法,除非您有非常非常好的理由将其命名为create
@AlexeySchepin@BKSpurgeon,我表示歉意,这是代码片段的一个糟糕示例。那里不应该有create
方法。令人惊讶的是,我将测试并报告。非常感谢@AlexeySchepin。旁注,是不是被打破了?有时显示,有时不显示。@BKSpurgeon@alexey schepin很抱歉,我在片段中犯了一个错误foo
位于controller/application\u controller.rb
请再次查看代码段。抱歉。嘿@MavinaLim,控制器中没有保存前的回调。您可以在执行操作之前使用,
或该列表中的其他回调,我想可能存在一些概念上的误解。你能解释一下你到底想要实现什么吗?找到一个合适的解决方案是很容易的。@AlexeySchepin我已经用一个用例更新了edit。再次感谢您的帮助!