Rails 具有共享布局的独立命名空间的引擎

Rails Engine With Isolated Namespace Sharing a Layout

我有一个 Rails Engine,我想从容器应用程序中共享一个布局。我想支持主应用程序布局中的所有 URL 助手,以使集成变得微不足道。那就是支持容器应用程序中的助手布局:

= link_to "Signup", new_user_path
= link_to "Login", new_user_path
...

这导致:

undefined local variable or method `new_user_path' for #<#:0x007f9bf9a4a168>

我可以通过将 application.html(在容器应用程序中)更改为:

来修复它
= link_to "Signup", main_app.new_user_path
= link_to "Login", main_app.new_user_path

但目标是使集成引擎不需要用户对现有功能进行更改application.html

我相信我也可以通过从 lib/example/engine.rb 中删除 isolate_namespace Example 来修复错误,但这会破坏引擎中的几乎所有内容。

有什么方法可以让容器应用程序助手和显式命名我的引擎助手以避免冲突? (即使用 example.root_path 而不是 root_path)?

看看这个:https://github.com/rails/rails/blob/a690207700d92a1e24712c95114a2931d6197985/actionpack/lib/abstract_controller/helpers.rb#L108

您可以在您的主机应用程序中包含引擎中的助手。

module Blargh
  class Engine < ::Rails::Engine
    isolate_namespace Blargh

    config.to_prepare do


      # application helper
      ApplicationController.helper(Blargh::ApplicationHelper)
      # any other helper
    end
  end
end

这样您就可以在 rails 主机中毫无问题地使用您的助手。当然,这种方式并没有真正的命名空间,因此如果您引擎的用户将新的辅助方法命名为与您的辅助方法相同,就会发生冲突。

这是否回答了您的问题?