Rails引擎与孤立的命名空间共享布局

Kev*_*tre 9 ruby-on-rails rails-engines

我有一个Rails引擎,我想从容器应用程序共享一个布局.我想支持主应用程序布局中的所有URL帮助程序,以使集成变得微不足道.这是为了支持容器应用程序中包含帮助程序的布局:

= link_to "Signup", new_user_path
= link_to "Login", new_user_path
...
Run Code Online (Sandbox Code Playgroud)

这导致:

未定义的局部变量或方法`new_user_path'用于#<#:0x007f9bf9a4a168>

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

= link_to "Signup", main_app.new_user_path
= link_to "Login", main_app.new_user_path
Run Code Online (Sandbox Code Playgroud)

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

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

任何方式允许容器应用程序帮助程序和显式命名我的引擎帮助程序,以避免冲突?(即使用example.root_path而不是root_path)?

Hol*_*off 1

看看这个: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
Run Code Online (Sandbox Code Playgroud)

这样你就可以在你的 Rails 主机中使用你的助手而不会出现问题。当然,这种方式没有真正的命名空间,因此,如果引擎的用户将新的帮助器方法命名为与您的帮助器方法相同,则会发生冲突。

这是否回答你的问题?