9025


## やりたいこと

Redmineのプラグインを作成しています.  
RedmineのApplicationHelperにはlink_to_projectというメソッドがあり、これを書き換えたいのですが、うまくいきません.

## 環境

  * Redmine 3.0.1
  * Rails 4.2.1
  * Ruby 2.1.5p273

## やったこと

<http://www.redmine.org/projects/redmine/wiki/Plugin_Internals>を参考に

lib/action_helper_patch.rb

[code]

    require 'application_helper'
    
    module ApplicationHelperPatch
      def self.included(base)
        base.send(:include, InstanceMethods)
    
        base.class_eval do
          unloadable
          alias_method_chain :link_to_project, :project_owner
        end
      end
    
    
      module InstanceMethods
        def say_hello
          'say Hello'
        end
        def link_to_project_with_project_owner(project, options={}, html_options = nil)
          if project.archived?
            h(project.name)
          else
            link_to 'hello',
              project_url(project, {:only_path => true}.merge(options)),
              html_options
          end
        end
      end
    
    end
    
    
    ApplicationHelper.send(:include, ApplicationHelperPatch)
    
[/code]

init.rbに次の１行を加えました.

[code]

    require_dependency 'application_helper_patch'
    
[/code]

## 試したこと

自作のプラグインのViewで次のヘルパーを試してみましたが、link_to_projectだけ、思ったとおりに'hello'と表示されず、もとのプロジェクト名が表示されてしまいます.(もちろんproject.archived?はfalseなものもです.)

  * say_hello 'say_hello'と表示されました.
  * link_to_project_with_project_owner 'hello'というリンクが表示されました.
  * link_to_project プロジェクト名が表示されます.

また、Redmineで使っているlink_to_projectもそのままで書き換えられていません.

## 質問

alias_method_chainの使い方をどこかで間違えているのでしょうか？  
また、もとのlink_to_projctを書き換えるにはどうしたらいいでしょうか？


CC BY-SA 3.0
2015-04-09T23:42:47.667
8972
2015-04-10T15:42:01.523
199
question
ruby ruby-on-rails redmine
RedmineでApplicationHelperの既存のメソッドを書き換えるには？


## prependを使う

alias_method_chainではなくprependを使うことで一応目的を達成できました.  
<http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/prepend.html>

[code]

    require 'application_helper'
    
    module ApplicationHelperPatch
      def say_hello
        'say Hello'
      end
      def link_to_project(project, options={}, html_options = nil)
        if project.archived?
          h(project.name)
        else
          link_to 'hello',
            project_url(project, {:only_path => true}.merge(options)),
            html_options
        end
      end
    end
    
    module ApplicationHelper
      prepend ApplicationHelperPatch
    end
    
[/code]


CC BY-SA 3.0
2015-04-10T15:42:01.523
9025
2015-04-10T15:42:01.523
199
8972
answer