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
)?
您可以在您的主机应用程序中包含引擎中的助手。
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 主机中毫无问题地使用您的助手。当然,这种方式并没有真正的命名空间,因此如果您引擎的用户将新的辅助方法命名为与您的辅助方法相同,就会发生冲突。
这是否回答了您的问题?
我有一个 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
)?
您可以在您的主机应用程序中包含引擎中的助手。
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 主机中毫无问题地使用您的助手。当然,这种方式并没有真正的命名空间,因此如果您引擎的用户将新的辅助方法命名为与您的辅助方法相同,就会发生冲突。
这是否回答了您的问题?