2014-10-10 72 views
-1

我在我的項目目錄中有一個common文件夾,我們在項目之間共享某些類(使用其他技術作爲引擎不是我們此時的選項)。我們在該文件夾中有「複製」項目結構,因此我們有一些路徑,如common/app/models,common/lib等)。要加載所有的模型,我們使用:從共享代碼文件夾中的模型擴展行爲

config.autoload_paths += %W(
    #{config.root}/common/app/models 
    #{config.root}/lib 
) 

但現在我需要以某種方式之一的行爲對類擴展的common/app/models文件夾中。

我的第一選擇是在常規應用模型文件夾中創建一個新的ExtendedModel,從SharedModel繼承,記錄遷移到新的模型,然後將類似ExtendedModel = SharedModel一個初始化內。它會工作,但似乎有點棘手。

我的第二個選擇是在應用程序模型文件夾中創建一個新模型,其名稱與SharedModel和其他方法相同,但Rails似乎忽略了此模型,並且它僅使用了SharedModel

任何想法,將不勝感激:)

+0

Ruby允許你動態地擴展類,所以不應該有這個問題。所以,我的建議是進入命令行(rails c)加載你的模型擴展定義,並檢查一個新的實例是否有這個新的方法。 – tomsoft 2014-10-10 12:20:57

+0

這聽起來對我來說過於複雜。此外,自動加載部分與此有什麼關係?不是關於繼承和混搭嗎? – phoet 2014-10-10 13:06:13

+0

@tomsoft我已經試過這個,並且該方法沒有加載。我找到了解決方法,我會回答我的問題。 – 2014-10-11 09:18:40

回答

-1

最後我趕到某種解決辦法,雖然我不能認爲這是一個非常令人滿意的一個:(。

我加了一個shared_model.rb文件app/models與以下內容:

SharedModel.class_eval do 
    def overriden_method 
    puts 'hi!' 
    end 
end 

然後,我添加了內容的初始化:

load('app/models/shared_model.rb'). 

我正在做更多的測試,但似乎工作。

+0

這比其他任何猴子補丁更好嗎?你爲什麼要加載文件,而不是把它放到一個自動加載的文件夾中?你會用這個剎車類加載。 – phoet 2014-10-11 22:06:22

+0

@phoet因爲它有效,並避免將所有代碼放入初始化程序。至少對我而言,將帶有重寫行爲的類放在app/models文件夾中不起作用。你的建議是什麼? :) – 2014-10-12 09:52:47