Как переопределить вспомогательный метод контроллера, загруженный из драгоценного камня - PullRequest
0 голосов
/ 07 мая 2020

У меня есть ситуация, когда я пытаюсь избежать изменения сотен представлений rails, которые вызывают вспомогательный метод ( page_title ), загруженный из драгоценного камня. Я хочу создать помощник с таким же именем (page_title). Затем в этом новом помощнике page_title я хочу проверить условие; если условие true , я хочу выполнить несколько logi c, и если оно false , , я хочу выполнить помощник page_title, загруженный из драгоценного камня.

В наших представлениях мы вызываем page_title (загружается из гема):

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

Гем загружает этот модуль ...

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

Я перепробовал все виды гимнастики, пытаясь заставить это работать, и все безуспешно. Моя последняя попытка заключалась в попытке использовать псевдоним метода page_title в геме для old_page_title в надежде, что когда мой помощник page_title (см. Ниже) будет загружен, он переопределит page_title в геме, и все будет хорошо, но старый 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

1 Ответ

1 голос
/ 08 мая 2020

Это решило мою проблему. Простой:

# /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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...