Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 在主应用程序的路径帮助程序中删除对主应用程序前缀的需要_Ruby On Rails 4_Rails Engines - Fatal编程技术网

Ruby on rails 4 在主应用程序的路径帮助程序中删除对主应用程序前缀的需要

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

我有一个独立的、可装载的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 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