4

twitterブートストラップを使用してアプリを作成しています。私はFontAwesomeを使用してさまざまな場所、多くの場合リンクにアイコンを追加しています。これまで、グローバルヘルパーを使用してきました。簡略化されたバージョンは次のとおりです。

# app/helpers/link_to_with_icon.rb
def link_to_with_icon(text, path, options={})
  options = options.clone
  icon = options.delete(:icon)
  text = "<i class='#{icon}'></i> #{text}" if icon.present?
  link_to(text, path, options)
end

これは機能しましたが、新しいリンクにアイコンを追加する必要があるたびに変更link_toすることを覚えておく必要がありました(アプリは新しいので、常に流動的です)。link_to_with_iconそこで、完全に使用をやめ、 (互換性があるため)にlink_to置き換えました。link_to_with_icon

しかし、私はもう使用していないので、そもそもlink_to変更したほうがよいことに気づきました。link_to確かに、オプションを理解させるために、libフォルダーにモンキーパッチを追加することができ:iconます。

# lib/extensions/url_helper_extensions.rb
module ActionView
  module Helpers
    module UrlHelper

      # do some magic here

    end
  end
end

数年前、私はこれと同じようなことをしたことがあります。当時、alias_method_chainヘルパーはその仕事に適したツールでした。Rails 3.xでは、モジュールと継承を優先して非推奨になっているようです。

しかし、そのページの例を正しく理解している場合は、link_toある種のBaseモジュールによって提供されるメソッドが必要になります。そうしないと、「Pre-Extension」を追加できません。

したがって、私の質問:モジュールを使用してlink_toを拡張できますか?または私は使用する必要がありますalias_method_chainか?

特に、:iconオプションの実用的な実装をいただければ幸いです。

4

2 に答える 2

3

私は単にするだろう:

# app/helpers/my_helper.rb

module MyHelper
  def link_to(text, path, options={})
    options = options.clone
    icon = options.delete(:icon)
    text = "<i class='#{icon}'></i> #{text}" if icon.present?
    super(text, path, options)
  end
end

link_toただし、ブロックで使用する場合は注意してください。

于 2012-11-26T13:27:00.820 に答える
3

これを別のヘルパーに追加するか、に追加しますApplicationHelper

def link_to(text, path, options = {}, &block)
  icon = options.delete(:icon)
  text = content_tag(:i, text, :class => icon) if icon
  super
end

また、オプションを元のメソッドiconに送信したくないため、オプションのハッシュを複製する必要はありません。link_to

于 2012-11-26T13:46:10.130 に答える