2013-10-31 47 views
0

我正在寫一個Spree擴展,其中一個模型與Spree::Variant創建一對一的關係。我創建了以下裝飾:裝飾者Spree ::變種

# app/models/spree/variant_decorator.rb 
Spree::Variant.class_eval do 
    has_one :persomodel, class_name: 'Extension::Persomodel' 
end 

我發現,這個裝飾沒有通過運行console評估。查看spree_core(版本2.0.3)中的Variant型號,我看到沒有文件app/model/variant.rb,只是一個文件app/model/variant/scope.rb。我想這就是爲什麼我的裝飾沒有評估。

我該如何執行我期待的關係?

+0

相應的文件應該在https://github.com/spree/spree/blob/v2.0.3/core/app/models/spree/variant.rb – GeekOnCoffee

+0

謝謝,您的意見是有幫助的。我由於某種原因忽略了這個文件... –

回答

4

我不確定你的結論是否正確。

在施普雷應用一個典型地包括類似於在application.rb中

config.to_prepare do 
    ['../app/**/*_decorator*.rb'].each do |glob| 
    Dir.glob(File.join(File.dirname(__FILE__), glob)) do |c| 
     Rails.configuration.cache_classes ? require(c) : load(c) 
    end 
    end 
end 

此迭代形式* _decorator的所有文件中的以下一個部分* .RB在應用程序目錄,並且需要/負載他們根據需要。

如果你正在構建一個擴展爲Rails的引擎,你會放一個類似的塊:

Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c| 
    Rails.configuration.cache_classes ? require(c) : load(c) 
end 

在config.to_prepare塊在engine.rb

你有適當的代碼在config.to_prepare塊適合您的項目?如果它存在,那麼你的代碼應該被評估。

+0

嗨,彼得,你是對的。我將你推薦的代碼添加到我的engine.rb文件中,現在該協會完美地工作。我已經看到了這種包容機制,但並沒有真正意識到這一點。你的回答幫助了我,我學到了一些東西。非常感謝您的寶貴幫助! –