隔离引擎(门卫) - 使用main_app中的帮助方法

时间:2012-06-04 09:32:56

标签: ruby-on-rails-3 gem

我希望我的门卫视图使用应用程序布局:

https://github.com/applicake/doorkeeper/wiki/Customizing-views

它包含主应用程序中的路由和辅助方法。

对于路由,我可以将main_app添加到路径前面,但是对于helper方法,我收到以下错误:

undefined method `is_active?' for #<ActionDispatch::Routing::RoutesProxy:0xade808c>

<li class="<%= main_app.is_active?("high_voltage/pages", "api") %>"><%= link_to t('developers'), page_path('api') %></li>

这是为什么?帮助者在app/helpers/application_helper.rb

3 个答案:

答案 0 :(得分:8)

如果您生成了视图并将它们放在app/views/doorkeeper/**中,那么引擎仍会使用门卫控制器。

要解决此问题,您必须将助手包含在引擎的ApplicationController中。假设你有类似的东西:

应用程序/助手/ application_helper.rb

module ApplicationHelper
  def my_helper
    "hello"
  end
end

应用程序/视图/看门/应用/ index.html.erb

<p>
  <%= my_helper %>
</p>

在将应用程序助手包含在门卫控制器中之前,这不起作用。所以在config/application.rb

class YourApp::Application < Rails::Application
  config.to_prepare do
    # include only the ApplicationHelper module
    Doorkeeper::ApplicationController.helper ApplicationHelper

    # include all helpers from your application
    Doorkeeper::ApplicationController.helper YourApp::Application.helpers
  end
end

当您想要自定义布局时,这是类似的配置。

答案 1 :(得分:1)

application_helper.rb中的辅助方法不是main_app的方法。

main_app变量是一个具有ActionDispatch :: Routing :: RoutesProxy的类/模块的对象。

main_app是一个帮助程序,可让您访问应用程序路径。例如,main_app.page_path('api')。

我假设,有了门卫,你需要访问你想要的路径; main_app.highvoltage_page_path( 'API')。some_doorkeeper_active_method

至少应该向你发送正确的方向,另见:

http://edgeapi.rubyonrails.org/classes/Rails/Engine.html#label-Using+Engine%27s+routes+outside+Engine

祝你好运。

答案 2 :(得分:0)

嗯,这个问题很老了,但我遇到了完全相同的问题,我有一个解决方案。菲利普·伊莱亚斯·菲利普的回答要求。

你需要做一点“覆盖”。将门卫的引擎application_controller.rb文件复制到您的应用程序到app / doorkeeper /。然后只需更改

module Doorkeeper 
  class ApplicationController < ActionController::Base

module Doorkeeper 
  class ApplicationController < ::ApplicationController

现在让门卫使用你的ApplicationController,它可能拥有你需要的所有方法。与https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-views一起,一切都很有效。