Если вы включаете модуль Foo
в класс SomeClass
, а затем добавляете к этому модулю другой модуль Bar
, любая перезапись метода внутри Bar
не повлияет на SomeClass
. Пример:
module Foo
def some_method
puts 'In Foo'
end
end
class SomeClass
include Foo
end
SomeClass.new.some_method # => 'In Foo'
module Bar
def some_method
puts 'In Bar'
super
end
end
Foo.prepend Bar
Foo.ancestors # => [Bar, Foo]
SomeClass.new.some_method # => 'In Foo'
class AnotherClass
include Foo
end
AnotherClass.new.some_method # =>
# 'In Bar'
# 'In Foo'
Я пытаюсь исправить вспомогательный метод ActionView следующим образом:
In lib/core_extensions/action_view/helpers/url_helper/secure_link_to
:
module CoreExtensions
module ActionView
module Helpers
module UrlHelper
module SecureLinkTo
def link_to(name = nil, options = nil, html_options = nil, &block)
html_options ||= {}
if html_options[:target].present?
html_options[:rel] = 'noopener noreferrer'
end
super(name, options, html_options, &block)
end
end
end
end
end
end
а затем в инициализаторе:
ActionView::Helpers::UrlHelper.prepend CoreExtensions::ActionView::Helpers::UrlHelper::SecureLinkTo
Однако, похоже, это не работает. Мое предположение - к моменту выполнения инициализатора ActionView::Helpers::UrlHelper
уже было включено (там, где оно должно быть включено), и поэтому добавление, похоже, не вступает в силу. Кто-нибудь знает решение этого?
ActionView::Helpers::UrlHelper
и не определить там метод? (кроме того, ваш подход кажется несколько более чистым) - person Andrey Deineko   schedule 01.11.2016prepend
как лучшее решение. - person Alexander   schedule 01.11.2016