gpt4 book ai didi

ruby-on-rails - 如何让 Rails 引擎与主应用程序交互

转载 作者:行者123 更新时间:2023-12-04 06:08:42 25 4
gpt4 key购买 nike

我正在创建一个用作支付服务接口(interface)的 rails 引擎。我必须处理支付服务在任何交易之外向我发送消息的用例。
我将采用以下用例:

引擎收到一条消息,表明订阅 FooBar42 已正确计费(通过它自己的路线)。我的引擎下一步做什么?
如果我开始调用特定于我的应用程序的模型,我的引擎只适用于这个应用程序。
我能找到的唯一示例是设计,但在设计中,它只是向您的用户模型添加方法,引擎处理用户的存储方式和所有代码。

如何创建一个可重用系统,让我的引擎可以在主应用程序中调用/触发代码?

我是否覆盖引擎 Controller ?我是否会生成一个带有空方法的服务对象,用作引擎-应用程序通信系统?

最佳答案

您需要有一种方法可以在初始化程序中或通过调用模型中的类方法来配置引擎,就像在调用 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 的主引擎文件中提供一个配置 Hook 作为模块方法:
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

希望这能回答你的问题。

关于ruby-on-rails - 如何让 Rails 引擎与主应用程序交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936813/

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