【问题标题】:Isolated engine (doorkeeper) - use helper methods from the main_app隔离引擎(门卫) - 使用 main_app 中的辅助方法
【发布时间】:2012-06-04 09:32:55
【问题描述】:

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

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

这包含来自主应用程序的路由和辅助方法。

对于路由,我可以在路径前添加 main_app 前缀,但对于辅助方法,我收到以下错误:

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

【问题讨论】:

    标签: ruby-on-rails-3 gem


    【解决方案1】:

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

    要解决此问题,您必须将帮助程序包含到引擎的 ApplicationController 中。假设你有这样的东西:

    app/helpers/application_helper.rb

    module ApplicationHelper
      def my_helper
        "hello"
      end
    end
    

    app/views/doorkeeper/applications/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
    

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

    【讨论】:

    • 成功了,谢谢。如果你也知道如何访问像 current_user 这样的 applicationcontroller 方法,请分享:)
    • 目前还没有找到方法,但我会尝试
    • 有趣的是,我也在尝试从我的门卫布局中找到一种访问application_controller 方法的方法。你找到解决办法了吗?
    【解决方案2】:

    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

    祝你好运。

    【讨论】:

    • 我链接到的门卫 wiki 表明您也可以在辅助方法上使用它。我已经阅读了 rails 文档,不幸的是这对我没有帮助。 main_app.highvoltage_page_path('api').some_doorkeeper_active_method - 不知道你的意思是什么,但我的主应用程序和门卫引擎应该共享相同的布局。活跃?是一个辅助方法,带有两个参数,一个控制器和一个动作,当它们与当前页面匹配时返回“活动”。
    【解决方案3】:

    嗯,这个问题很老了,但我遇到了完全相同的问题,我有一个解决方案。在 Felipe Elias Philipp 的回答中提出的要求。

    你需要做一点“覆盖”。将门卫的引擎 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 一起,一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      相关资源
      最近更新 更多