【发布时间】: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
【问题讨论】:
-
我认为您想通过 ActiveSupport::Concern 执行此操作 - guides.rubyonrails.org/v5.1/… api.rubyonrails.org/v5.1.7/classes/ActiveSupport/Concern.html
-
@tgmerritt 做到了,谢谢。发布它,我会选择它作为答案。
-
@tgmerritt 实际上似乎我根本不需要担心,只需要做我指定的事情。
标签: ruby-on-rails ruby ruby-on-rails-4 rubygems