2013-05-31 3 views
0

Я хочу переопределить вспомогательный метод с моим плагином. Я пытался создать новый вспомогательный модуль с методом, который должен переопределить так:Как добавить/переопределить метод для помощника

myplugin/app/helpers/issues_helper.rb 

module IssuesHelper 
    def render_custom_fields_rows(issus) 
    'it works!'.html_safe 
    end 
end 

Но это не работает. Основной метод все еще используется в соответствующем представлении.

Hack Решение:

issues_helper_patch.rb 

module IssuesHelperPatch 
    def self.included(receiver) 
    receiver.send :include, InstanceMethods 

    receiver.class_eval do 
     def render_custom_fields_rows(issue) 
     "It works".html_safe 
     end 
    end 
    end 
end 

init.rb 

Rails.configuration.to_prepare do 
    require 'issues_helper_patch' 
    IssuesHelper.send  :include, IssuesHelperPatch 
end 

Это хак, потому что в обычных методах пути должны быть в InstanceMethods модуле IssuesHelperPatch модуля.

+0

'return' подразумевается, если ваше значение находится на последней строке. В том числе это, как правило, предполагает, что он существует по какой-то причине и может привести к путанице. – tadman

+0

Вы уверены, что этот метод выполняется? Когда вы говорите «не работает», вы не являетесь конкретным. – tadman

+0

@tadman Я просто удалил много кода, чтобы сделать пример меньшим, поэтому ваше предложение не имеет значения. Благодарю. – freemanoid

ответ

0

Это ИМХО хорошо решение этой проблемы:

issues_helper_patch.rb 
module IssuesHelperPatch 
    module InstanceMethods 
    def render_custom_fields_rows_with_message(issue) 
     "It works".html_safe 
    end 
    end 

    def self.included(receiver) 
    receiver.send :include, InstanceMethods 

    receiver.class_eval do 
     alias_method_chain :render_custom_fields_rows, :message 
    end 
    end 
end 

init.rb 

Rails.configuration.to_prepare do 
    require 'issues_helper_patch' 
    IssuesHelper.send  :include, IssuesHelperPatch 
end 
+0

Это нехорошее решение. Вы должны использовать метапрограммирование, которое идеально подходит для того, что вы хотите сделать. –

3
IssuesHelper.class_eval do 
    def render_custom_fields_rows(issus) 
    'it works!'.html_safe 
    end 
end 
+0

Хорошо, но это похоже на взлома. Вопрос обновлен. – freemanoid

+0

@freemanoid Это не хак. Это Ruby Metaprogramming. –

Смежные вопросы