我的工作有一個ApplicationController中類似於以下一個Rails 2.1的項目:我將如何重構Rail的ApplicationController並將常量設置爲ActiveRecord結果?
class ApplicationController < ActionController:Base
THIS_SITE = Site.find_by_url('www.example.net')
ADMIN_ROLES = StaffRole.find(:all, :conditions => ["site_id = ? AND name IN (?)", ApplicationController::THIS_SITE.id, 'Administrator'])
end
我因爲在我的測試環境無法運行測試,我會得到一個錯誤說THIS_SITE爲零時嘗試定義ADMIN_ROLES。我通過執行以下操作解決了該問題:
class ApplicationController < ActionController:Base
def self.this_site
@@this_site ||= Site.find_by_url('www.example.net')
end
def self.admin_roles
@admin_roles ||= StaffRole.find(:all, :conditions => ["site_id = ? AND name IN (?)", ApplicationController::this_site.id, 'Administrator'])
end
ApplicationController::THIS_SITE
和ApplicationController::ADMIN_ROLES
貫穿在視圖,控制器和模型應用程序中使用。我覺得這都是錯誤的和骯髒的。我錯了,認爲這是錯誤的/骯髒的?如果不是,這又如何重構?
謝謝。
是的,Rails 2.1是舊的,但這是我目前的工作。單個@字符看起來是正確的,我會測試它。你看起來確實是按應用程序設置的,但是信息存儲在數據庫中(每個應用程序具有相同的代碼和數據庫結構,但數據不同)。該應用程序假定網站和管理員StaffRoles已輸入到數據庫中。數據庫信息是否可以從config/initializers中提取?我的測試是否需要每次加載Sites和StaffRoles燈具?我感謝您的幫助。謝謝。 – 2011-06-09 14:26:29
是的,如果我沒有弄錯,你可以在初始化器中訪問數據庫。是的,你需要在測試過程中每次加載你的燈具。然而,Rails已經爲你做到了這一點:只需在你的燈具中添加所有需要的數據。只要確保你添加了「夾具:模型」一行。但是,要使**測試**在初始化過程中訪問數據庫中的數據,您必須具有「預填充」測試數據庫;我猜'RAILS_ENV =測試rake db:fixtures:load'應該將你的燈具加載到數據庫中。 (注意:RAILS_ENV在這裏非常重要!) – radiospiel 2011-06-10 09:16:13