Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何让rails引擎与主应用程序交互_Ruby On Rails_Gem - Fatal编程技术网

Ruby on rails 如何让rails引擎与主应用程序交互

Ruby on rails 如何让rails引擎与主应用程序交互,ruby-on-rails,gem,Ruby On Rails,Gem,我正在创建一个rails引擎,用作支付服务的接口。我必须处理支付服务在任何交易之外向我发送消息的用例。 我将采用以下用例: 引擎收到一条消息,表明订阅FooBar42已正确计费(通过其自身的路由)。我的引擎接下来做什么? 如果我开始调用特定于我的应用程序的模型,我的引擎仅适用于此应用程序。 我能找到的唯一例子是Deviate,但在Deviate中,它只是向用户模型添加方法,引擎处理用户的存储方式和所有代码 如何创建一个可重用的系统,使我的引擎可以调用/触发主应用程序中的代码 我是否超越发动机控制

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

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

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


我是否超越发动机控制器?我是否使用空方法生成服务对象,并将其用作引擎应用程序通信系统?

您需要在初始值设定项中或通过调用模型中的类方法来配置引擎,与在用户类主体中调用
designe
时如何配置designe以使用用户模型非常相似:

class User < ActiveRecord::Base
  devise :database_authenticatable
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

希望这能回答您的问题。

答案很好,我会这么做,我甚至可以用“model\u接收错误”和“model\u接收付款”来拒绝。
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