【问题标题】:How to override controller helper method loaded from a gem如何覆盖从 gem 加载的控制器辅助方法
【发布时间】:2020-08-22 22:11:03
【问题描述】:

我有一种情况,我试图避免更改数百个调用从 gem 加载的辅助方法 (page_title) 的 rails 视图。我想创建一个具有完全相同名称的助手(page_title)。然后,在这个新的 page_title 助手中,我想检查一个条件;如果条件为 true,我想执行一些逻辑,如果它是 false,我想执行从 gem 加载的 page_title 帮助程序。

在我们看来,我们正在调用 page_title(从 gem 加载):

<%= page_title domain: "Leasing", page: "Guest Cards" %>

gem 加载此模块...

module OsmUiHelper
  ...
  def page_title(options = {})
    ...
  end
  ...
end

...像这样...

module OsmUi
  module Rails
    class Engine < ::Rails::Engine
      ...
      config.to_prepare do
        ApplicationController.helper(OsmUiHelper)
      end
    ...
  end
end

我已经尝试了各种体操来让它发挥作用,但都失败了。我最近的尝试是尝试将 gem 中的 page_title 方法别名为 old_page_title,希望当我的 page_title 助手(见下文)被加载时,它会覆盖 gem 中的 page_title 并且一切都会好起来,但是 gem 中的旧 page_title正在调用:

# /controllers/helper/page_title_helper.rb
module Controllers
  module PageTitleHelper
    def page_title(options = {})
      company_id = settings ? settings.company_id : 0
      if Feature.on?('omnibar_enabled', company_id)
        # Use my page_title logic here
      else
        # Use the gem page_title aliased as old_page_title (see below)
        old_page_title(options)
      end
    end
  end
end

# /rails/lib/osm_ui_helper_patch.rb
require 'osm_ui_helper'

module OsmUiHelper
  alias_method :old_page_title, :page_title
end

我怎样才能让它工作?有没有可能直接在 ApplicationController.helpers 中操作助手?我已经束手无策了。

提前致谢。

解决方案

这解决了我的问题。简单:

# /rails/app/helpers/controllers/page_title_helper.rb

module Controllers
  module PageTitleHelper
    include OsmUiHelper

    alias old_page_title page_title

    # rubocop:disable Style/OptionHash
    def page_title(options = {})
      company_id = settings ? settings.company_id : 0
      if Feature.on?('omnibar_enabled', company_id)
        # New logic here
      else
        # Use the old page_title in the gem
        old_page_title(options)
      end
    end
    # rubocop:enable Style/OptionHash
  end
end

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems


【解决方案1】:

这解决了我的问题。简单:

# /rails/app/helpers/controllers/page_title_helper.rb

module Controllers
  module PageTitleHelper
    include OsmUiHelper

    alias old_page_title page_title

    # rubocop:disable Style/OptionHash
    def page_title(options = {})
      company_id = settings ? settings.company_id : 0
      if Feature.on?('omnibar_enabled', company_id)
        # New logic here
      else
        # Use the old page_title in the gem
        old_page_title(options)
      end
    end
    # rubocop:enable Style/OptionHash
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2011-08-03
    • 2021-11-03
    • 2011-03-12
    • 2012-02-13
    相关资源
    最近更新 更多