ruby-on-rails – 如何让rails引擎与主App交互
发布时间:2020-12-17 02:40:59 所属栏目:百科 来源:网络整理
导读:我正在创建一个用作支付服务接口的rails引擎.我必须处理支付服务在任何交易之外向我发送消息的用例. 我将采用以下用例: 引擎收到一条消息,说明订阅FooBar42已正确计费(通过它自己的路由).我的引擎下一步做什么? 如果我开始调用特定于我的应用程序的模型,我
我正在创建一个用作支付服务接口的rails引擎.我必须处理支付服务在任何交易之外向我发送消息的用例.
我将采用以下用例: 引擎收到一条消息,说明订阅FooBar42已正确计费(通过它自己的路由).我的引擎下一步做什么? 如何创建可重用的系统,我的引擎可以在主应用程序中调用/触发代码? 我是否覆盖发动机控制器?我是否使用空方法生成服务对象,将其用作引擎应用程序通信系统? 解决方法
您需要有一种方法可以在初始化程序中或通过调用模型中的类方法来配置引擎,就像在User类的主体中调用devise时配置Devise以使用User模型一样:
class User < ActiveRecord::Base devise :database_authenticatable end 对于我的一个引擎,我使用初始化程序,它使用配置对象存储引擎与之交互的类. 给定一个配置对象: class Configuration attr_reader :models_to_interact_with def initialize @models_to_interact_with = [] end end 然后,您可以在lib的主引擎文件中提供配置挂钩作为模块方法: require 'my_engine/configuration' module MyEngine mattr_reader :config def self.configure(&block) self.config ||= Configuration.new block.call self.config end end 现在,当您在主应用程序中时,可以在config / initializers / my_engine.rb中创建初始化程序,并将模型添加到您的配置中: MyEngine.configure do |config| config.models_to_interact_with << User config.models_to_interact_with << SomeOtherModel end 现在您可以从引擎访问此引擎,而无需在引擎中对模型进行硬编码: # in some controller in your engine: def payment_webhook MyEngine.config.models_to_interact_with.each do |model| model.send_notification_or_something! end end 希望这能回答你的问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |