具有隔离命名空间的Rails引擎共享布局

时间:2015-07-30 22:12:13

标签: ruby-on-rails rails-engines

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

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

这导致:

  

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

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

来解决此问题
= link_to "Signup", main_app.new_user_path
= link_to "Login", main_app.new_user_path

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

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

任何方式允许容器应用程序帮助程序并明确命名我的引擎助手以避免冲突? (即使用example.root_path代替root_path)?

1 个答案:

答案 0 :(得分:0)

看看这个: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主机中使用您的助手。当然,这种方式没有真正的命名空间,因此如果引擎的用户命名一个与辅助方法相同的新辅助方法,它将发生冲突。

这会回答你的问题吗?