2015-08-25 21 views
0

我正在使用gem acts_as_commentable_with_threading,並且我想向destroy方法添加一些東西。目前,如果您刪除評論並回複評論,它會刪除評論並回復。我只想保留這個函數僅用於根評論,但不是爲了孩子。所以,如果是這樣的如何編輯寶石的方法?

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

凡評論2,3和4是1所有兒童,但3也是2個孩子,我想讓它這樣,如果你刪除註釋2,註釋3將仍然在那裏。但是,保留它以便如果註釋1被刪除,則其下的所有註釋都將被刪除,因爲註釋1是根註釋。所以我必須編輯gem中的destroy方法來允許這樣做。我會如何去做這件事? (不是真的問如何做邏輯,而我在哪裏可以編輯方法,但我也很感激幫助的邏輯)

+0

叉'https:// github.com/elight/acts_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可能是Base,只能粗略看一下回購。 但是,如果是這種情況,最好重寫acts_as_commentable以添加合適的before_destroy以執行所需的功能。在ActiveRecord中重寫摧毀可能是一個糟糕的主意:) – geej

+0

那麼原始的摧毀方法的寶石將在我的摧毀版本運行後運行?如果是這樣的話,我不確定這會起作用,因爲在我的版本中它會保留答覆,但在gem的版本中它仍然會刪除它。 – Jill