2016-11-01 10 views
2

モジュール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が既に含まれているため(どこに含まれることになるのか)、プリペンドは効力をもたないようです。誰かがこれに対する解決策を知っていますか?

+0

なぜ 'ActionView :: Helpers :: UrlHelper'を再度開いてそこにメソッドを定義するだけではないのですか? (あなたのアプローチがいくらかもっときれいだと感じている点を除いて) –

+0

まさにあなたが言うように - 私はそれをきれいにしたいと思います。私はこれを次のようにしています:http://nofail.de/2014/06/monkey-patching-rails/この記事では、最善の解決策として 'prepend'を推奨しています。 –

答えて

1

モジュールプリペンドについてあなたの特定の質問に答えるがなければ、ここでは別の方法だろう。

のRailsでのヘルパーがグローバルであるので、あなたは、単に上書きlink_toメソッドを使用して独自のヘルパーを作成することができます。

module LinkHelper 
    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 

私はヘルパーモジュールに継承チェーンをハードコーディングする必要がないので、どういうわけかこれは、初期化子を作成するよりhacky少ないようです。

+0

あなたのanser、Magnussありがとうございます。このファイルはどこに置くのですか? –

+0

@AlexPopovこれは普通のヘルパーモジュールです。あなたは 'app/helpers'に入れます。 – Magnuss

+0

参考:http://stackoverflow.com/questions/10471535/override-rails-helpers-with-access-to-original –

関連する問題