2011-06-09 49 views
0

我的工作有一個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_SITEApplicationController::ADMIN_ROLES貫穿在視圖,控制器和模型應用程序中使用。我覺得這都是錯誤的和骯髒的。我錯了,認爲這是錯誤的/骯髒的?如果不是,這又如何重構?

謝謝。

回答

1

您在測試模式下的問題是,即使在測試數據庫被填充之前,ApplicationController類也會被加載。儘管使用常量本身沒有問題,定義類方法會將加載從DB時刻稍微移動到未來,並讓您運行測試。

不過,我認爲你的代碼中的「@@ this_site」應該是「@this_site」。

從系統架構師的角度來看,this_site和admin_roles看起來都像每個應用程序的設置,應該移出控制器部分。定義應用程序範圍設置的好地方是在配置/初始化程序下面或在您的環境中.rb

BTW:老的一面不是Rails 2.1嗎?

+0

是的,Rails 2.1是舊的,但這是我目前的工作。單個@字符看起來是正確的,我會測試它。你看起來確實是按應用程序設置的,但是信息存儲在數據庫中(每個應用程序具有相同的代碼和數據庫結構,但數據不同)。該應用程序假定網站和管理員StaffRoles已輸入到數據庫中。數據庫信息是否可以從config/initializers中提取?我的測試是否需要每次加載Sites和StaffRoles燈具?我感謝您的幫助。謝謝。 – 2011-06-09 14:26:29

+0

是的,如果我沒有弄錯,你可以在初始化器中訪問數據庫。是的,你需要在測試過程中每次加載你的燈具。然而,Rails已經爲你做到了這一點:只需在你的燈具中添加所有需要的數據。只要確保你添加了「夾具:模型」一行。但是,要使**測試**在初始化過程中訪問數據庫中的數據,您必須具有「預填充」測試數據庫;我猜'RAILS_ENV =測試rake db:fixtures:load'應該將你的燈具加載到數據庫中。 (注意:RAILS_ENV在這裏非常重要!) – radiospiel 2011-06-10 09:16:13

相關問題