【问题标题】:Rails mountable engine use db schema from main applicationRails 可安装引擎使用主应用程序中的 db 模式
【发布时间】:2016-06-14 18:50:47
【问题描述】:

我正在为我正在开发的应用程序创建一个 Rails 引擎。

应用程序基本上分为两个部分:

  1. 私人
  2. 公开

私有站点是所有管理功能所在的主要应用程序,公共站点(引擎)应该能够从私有应用程序访问模型。

这听起来与我相反,但这是规范所要求的。

我知道通常你会在你的主应用程序中访问引擎模型:

EngineName::Model

如何访问引擎内的主应用程序?

例子:

私人用户会去 foo.bar/videos/new 并创建一个新视频。

公共用户可以访问 foo.bar/public/videos 并访问这些相同的视频。

【问题讨论】:

  • 将功能拆分为私有和公共部分是有道理的,但为什么这种情况需要您使用引擎模式?
  • 我想这是一个很好的问题,但您似乎跳过了不必要的障碍。除了满足“规范”之外,您真正想通过这种方式完成什么?规范是程序员写的吗?
  • 通常我会将功能打包到引擎中,因为我想在其他地方重用它。如果引擎包含来自主机应用程序的代码调用,那么它将不可重用。在那种情况下,我很好奇你想从把它写成引擎中得到什么好处。如果您只是想在什么是公开的和什么是私有的之间划清界限,那可能是easier to use a namespace

标签: ruby-on-rails ruby ruby-on-rails-4 rails-engines


【解决方案1】:

我刚刚对此进行了测试,并且能够毫无问题地从引擎内的主机应用程序中引用代码。

# In the main application
# lib/test_library.rb
TestLibrary
  def self.say_something
    "Hello! I am defined in the host application, not the Engine."
  end
end

# Then, inside the engine
# app/views/your_engine_name/some_resource/index.html.erb
<%= TestLibrary.say_something %>

这在引擎模板中打印得很好。因此,如果您有一个 Video 模型,您可以在引擎内部的控制器中引用它,就像控制器是您的应用程序的一部分一样。

话虽如此,我不确定引擎模式是否最适合您的要求。

以这种方式编写意味着您不能在其他地方重用引擎代码,如果重用不是您关心的,那么引擎可能是比您需要的更重量级的解决方案。您可以考虑使用namespace

【讨论】:

  • 谢谢,是的,我完全同意命名空间更有意义,但我的团队负责人希望这样做,我感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
相关资源
最近更新 更多