2013-10-21 30 views
1

我有一個類GoodsTransaction:的ActiveSupport ::關注失蹤超級

require Rails.root.join('lib','two_parties_transaction.rb') 

class GoodsTransaction < Transaction 

    include TwoPartiesTransaction 

    def counterparty(org, loop = false) 

    res = #Some logic 
    res || super(org) 
    end 
end 

其中包括TwoPartiesTransaction模塊:

module TwoPartiesTransaction 
    extend ActiveSupport::Concern 

    included do 
    def counterparty(org) 
     #Some logic 
    end 
    end 
end 

和運行對手失敗:

[email protected]:~/src/white$ rails c 
Faraday::Builder is now Faraday::RackBuilder. 
Loading development environment (Rails 4.0.0) 
2.0.0p247 :001 > tr = GoodsTransaction.new 
=> #<GoodsTransaction _id: 5264e2eb75627540dd000000, e(end_date): nil, p(span): nil, s(start_date): nil, u(span_unit): nil, _type: "GoodsTransaction", a(autobook): nil, c(forced_close): nil, d(public_id): nil, k(autobook_period): nil, l(label): nil, n(autobook_number): nil, t(autobook_until): nil, contact_ids: nil, parent_id: nil, fc(creditor): nil, fd(debtor): nil> 
2.0.0p247 :002 > tr.counterparty(nil) 
NoMethodError: super: no superclass method `counterparty' for #<GoodsTransaction:0x000000090fe1d8> 
from /home/muichkine/src/white/app/models/transactions/goods_transaction.rb:148:in `counterparty' 

我是什麼這樣做會跳過超級coutnerparty方法嗎?

回答

1

要將模塊中的實例方法包含到類中,您不需要使用ActiveSupport::Concern。你可以做

module TwoPartiesTransaction 
    def counterparty(org) 
    # ... 
    end 
end 

您仍然可以使用ActiveSupport::Concern如果你需要它的其他原因,即在類的級別執行代碼(如scope等)或添加類方法的,包括類。有關ActiveSupport::Concernsee the API documentation的更多詳細信息。

+0

從你指出的文檔中,我明白1/ClassMethods擴展不包含在基類中,這不是我所看到的。 2 /文檔根本不談論ClassMethods是否是強制性的,因爲它們將代碼直接放置在'indluded do'塊中。我錯了嗎?! – muichkine

+0

1)我同意它很混亂,但'extend'會將模塊的實例方法添加爲類方法。這不是你想要的嗎? 2)我編輯了我的答案,也許這可以澄清一點。 –

+0

如果你碰巧想要模塊方法作爲包含該模塊的類中的實例方法,只需在模塊中使用普通方法(而不是在嵌套的'ClassMethods'中) –