Ruby on rails 4 在主应用程序的路径帮助程序中删除对主应用程序前缀的需要
我有一个独立的、可装载的rails引擎,它将自己装载到主机应用程序中已经声明的名称空间中。下面是它的大致外观: 插件中的routes.rb:Ruby on rails 4 在主应用程序的路径帮助程序中删除对主应用程序前缀的需要,ruby-on-rails-4,rails-engines,Ruby On Rails 4,Rails Engines,我有一个独立的、可装载的rails引擎,它将自己装载到主机应用程序中已经声明的名称空间中。下面是它的大致外观: 插件中的routes.rb: # my_engine/config/routes.rb MyEngine::Engine.routes.draw do namespace :admin do resources :some_resource end end 以及主机应用程序的routes.rb中的相应片段: # config/routes.rb mount MyEn
# my_engine/config/routes.rb
MyEngine::Engine.routes.draw do
namespace :admin do
resources :some_resource
end
end
以及主机应用程序的routes.rb中的相应片段:
# config/routes.rb
mount MyEngine::Engine, at: "/"
namespace :admin do
resources :host_resource
end
我在/
安装引擎,因为引擎中有一些路由应该在那里可用,并且管理员名称空间重叠是有意的
这些路由生成多个路径帮助程序,包括my\u engine.admin\u some\u resources\u path
和我期望的admin\u host\u resources\u path
。后者不起作用
假设主应用程序中有一个控制器声明为:
# app/controllers/admin/application_controller.rb
class Admin::ApplicationController < ApplicationController
layout 'admin'
end
当我加载像“/admin/host\u resources”这样的路径时,这可以很好地工作,它从主应用程序呈现管理布局没有问题。当打开进入插件的路径“/admin/some_resources”时,它停止工作,抱怨没有找到admin\u host\u resources\u路径。当我将其更改为以下内容时,它开始工作:
# app/views/layouts/admin.html.erb
<%= link_to "Host resources", main_app.admin_host_resources_path %>
<%= link_to "Plugin's resources", my_engine.admin_some_resources_path %>
#app/views/layouts/admin.html.erb
这不是我想要的,也不是我期望的。此外,我已经看到了足够多的rails插件,知道这是不必要的,但在阅读引擎文档之后,我仍然不知所措。我也搜索了堆栈,但没有结果。我的问题是:如何包含main_app helpers,以便不再需要前缀main_app
值得注意的是,host_资源的视图位于主应用程序本身中,而某些_资源的视图位于引擎中。不过这并不重要,因为主应用程序中的admin
布局不起作用
请原谅我的匿名代码,但这是我必须的。我在这里找到了我问题的答案:
我需要做的是在引擎中指定这样的助手:
module MyEngine
module ApplicationHelper
def method_missing method, *args, &block
if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
if main_app.respond_to?(method)
main_app.send(method, *args)
else
super
end
else
super
end
end
def respond_to?(method)
if method.to_s.end_with?('_path') or method.to_s.end_with?('_url')
if main_app.respond_to?(method)
true
else
super
end
else
super
end
end
end
end
然后,通过将以下内容添加到“我的发动机”类中,确保在加载发动机时已加载:
initializer 'my_engine.action_controller' do |app|
ActiveSupport.on_load :action_controller do
helper MyEngine::ApplicationHelper
end
end
因此,引擎提供的路径由引擎提供服务,其他所有内容都发送到主应用程序帮助程序。将此添加到控制器中:
helper Rails.application.routes.url_helpers
谢谢,它与我的Rails 6应用程序和引擎配合使用!
initializer 'my_engine.action_controller' do |app|
ActiveSupport.on_load :action_controller do
helper MyEngine::ApplicationHelper
end
end
helper Rails.application.routes.url_helpers