2015-08-25 3 views
0

Я использую gem actions_as_commentable_with_threading, и я хотел бы добавить что-то к методу destroy. В настоящее время, если вы удаляете комментарий и у него есть ответы, он удалит комментарий и его ответы. Я хотел бы сохранить эту функцию только для комментария root, но не для детей. Так что, если это нравится этаКак отредактировать метод драгоценного камня?

 Comment 1 
    /  \ 
    \  Comment 4 
    Comment 2 
     \ 
     \ 
     Comment 3 

Где комментарий 2, 3 и 4 являются все дети 1, но 3 тоже ребенок 2. Я хочу сделать так, что если удалить комментарий 2 комментария, 3 все равно будет там. Однако сохраните его так, чтобы, если комментарий 1 удален, все комментарии по нему удаляются, потому что комментарий 1 является комментарием root. Поэтому я должен отредактировать метод destroy в камне, чтобы это разрешить. Как мне это сделать? (Не совсем спрашивать, как делать логику, а где я могу отредактировать метод, но я также хотел бы получить помощь по логике)

+0

Вилка 'https: // github.com/elight/actions_as_commentable_with_threading', поместите свое собственное репо в Gemfile. В качестве альтернативы, обезьяна-патч это в вашем коде (но я бы не рекомендовал это, так как это может сломаться со следующей версией). – Amadan

ответ

1

Вы можете сделать это через monkey patching, что в основном связано с определением дополнительных аспектов класса или модуля в другом файле. Хорошее место, чтобы положить это, я нашел, находится в config/initializers.

Итак, если вы хотите перезаписать уничтожить метод класса A :: B, вы бы файл, который говорит что-то вроде:

require 'loads_a_b' 
module A 
    class B 
    def destroy_with_child_preservation 
     # your code 
    end 
    alias_method_chain :destroy, :child_preservation 
    end 
end 

И вы можете обратиться к оригинальному способу по телефону destroy_without_child_preservation

+0

Пара вопросов. Смущенный тем, что будет A и B. Итак, если я хочу использовать свой собственный метод уничтожения, я бы перенаправил его на destroy_with_child_preservation? – Jill

+0

На самом деле alias_method_chain сделает это за вас. Все, что вам нужно сделать, это вызвать destroy, а destroy_with_child_preservation будет вызываться. A и B являются произвольными. Я не совсем знаком с рассматриваемым камнем, но A может быть ActiveRecord, а B может быть базовым, только взглянув на репо на беглый взгляд. Но если это так, может быть лучше переопределить act_as_commentable, чтобы добавить соответствующий before_destroy для выполнения желаемых функций. Переопределение уничтожения в ActiveRecord - это, вероятно, плохая идея :) – geej

+0

Итак, первоначальный метод уничтожения драгоценного камня будет запущен после запуска моей версии destroy? Если это так, я не уверен, что это сработает, потому что в моей версии он будет поддерживать ответы там, но в версии gem он все равно удалит его. – Jill

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