モジュールFoo
をクラスSomeClass
に含める場合は、そのモジュールの前に別のモジュールBar
を追加します。Bar
内のメソッドの上書きはSomeClass
で無効になります。例:初期化子で、その後前置きでActionViewモジュールをmonkey-patchする方法はありますか?
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
と::
lib/core_extensions/action_view/helpers/url_helper/secure_link_to
で:
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ヘルパーメソッドに次のように猿パッチ
ActionView::Helpers::UrlHelper.prepend CoreExtensions::ActionView::Helpers::UrlHelper::SecureLinkTo
しかし、これは動作していないようです。私の前提 - イニシャライザが実行されるまでには、ActionView::Helpers::UrlHelper
が既に含まれているため(どこに含まれることになるのか)、プリペンドは効力をもたないようです。誰かがこれに対する解決策を知っていますか?
なぜ 'ActionView :: Helpers :: UrlHelper'を再度開いてそこにメソッドを定義するだけではないのですか? (あなたのアプローチがいくらかもっときれいだと感じている点を除いて) –
まさにあなたが言うように - 私はそれをきれいにしたいと思います。私はこれを次のようにしています:http://nofail.de/2014/06/monkey-patching-rails/この記事では、最善の解決策として 'prepend'を推奨しています。 –