У меня есть ситуация, когда я пытаюсь избежать изменения сотен представлений 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