2012-04-04 59 views
4

當您使用導軌腳手架創建名稱空間模型時,會得到兩個文件。例如,該支架:在導軌名稱空間模型中丟失名稱空間信息

rails generate model Staff::Location name:string address:string 

生成以下文件:

/app/models/staff.rb  
module Staff 
    def self.table_name_prefix 
    "staff_" 
    end 
    ... 

/app/models/staff/location.rb 
class Staff::Location < ActiveRecord::Base 
    ... 

我遇到的時候開發模式下軌卸載模塊的工作人員的問題,從來沒有重新加載。這會導致一些惱人的錯誤,例如由於缺少table_name_prefix,Location無法訪問它的表。當我不直接訪問模型時,例如通過多態關係,問題似乎就出現了。

我似乎無法獲得一致的基礎上加載模塊。這是命名空間模型的最佳實踐方式嗎?如果是這樣,我錯過了什麼?

+0

你可以給一個代碼產生這個錯誤的例子嗎?也許其中一個似乎經常失敗的關係? – Brandan 2012-04-14 23:50:55

回答

2

大約一年後,我終於找到了這個問題的答案。這個答案專門針對rails 3.1。我不確定這是否是rails 3.2中的問題。

設置模型時會出現該問題。如果使用腳手架,則不生成幫助文件。這通常位於/app/helpers/staff/location_helper.rb。有兩種方法來設置此文件:

module Staff::LocationHelper 
    ... 
end 

module Staff 
    module LocationHelper 
    ... 
    end 
end 

在rails 3.1中,專門用於幫助程序,您必須使用第一個解決方案。您不必將其用於在rails項目的其他部分使用命名空間的其他模塊。事實上,紅寶石中的某些結構需要第二種解決方案。

如果在聲明助手時使用第二種解決方案,在某些情況下,助手文件中的Staff模塊將覆蓋/app/models/staff.rb中的模塊。它會靜靜地將其替換爲文件中空的Staff模塊。這不會100%的時間發生,因爲助手並不總是被加載。

2

儘管我無法在Rails 3.2.2中重現該問題,但我之前遇到過這樣的問題。在開發模式下解決此問題的通用方法是通過回調ActionDispatch。這種加入config/environments/development.rb

MyApp::Application.configure do 
    ActionDispatch::Callbacks.before do 
    load Rails.root.join('app', 'models', 'staff.rb') 
    end 
end 

任何你在該塊做將每個請求之前執行,所以確保你只是做它的發展模式†否則,你將遭遇。性能受到影響。

我在staff.rb文件和Staff模塊本身內記錄了一條消息,兩條消息都出現在每條請求的日誌中。


†我嘗試使用to_prepare回調,因爲這似乎是the documented way to execute code before each request only when cache_classes is false。但是,似乎只有在重新啓動應用程序後才執行。至少有one other open Stack Overflow question regarding this,儘管他使用的語法稍微不同於我使用的語法。如果你能得到to_prepare的工作,我會建議,而不是before

相關問題