在我的Rails應用程序中,我試圖讓控制器變得更瘦,並且遇到了一個對象的困難,我不得不繞過它。需要幫助的代碼氣味
該對象表示用戶的Facebook會話,並且在會話之外被實例化,因此它存在於事物的控制器端。許多模型方法使用它,所以它在整個地方反覆傳入。
這聽起來像什麼東西,如何幹起來Rails的方式?謝謝!
在我的Rails應用程序中,我試圖讓控制器變得更瘦,並且遇到了一個對象的困難,我不得不繞過它。需要幫助的代碼氣味
該對象表示用戶的Facebook會話,並且在會話之外被實例化,因此它存在於事物的控制器端。許多模型方法使用它,所以它在整個地方反覆傳入。
這聽起來像什麼東西,如何幹起來Rails的方式?謝謝!
首先訪問@facebook_session變量,我會建議使用類似於Authlogic爲您的身份驗證系統。這給你兩個獎金:
class Widget < ActiveRecord::Base
def do_facebook_stuff
UserSession.find #This gets you the current session
UserSession.find.record # This gets your the user for the current session
end
end
現在你不再需要通過在會話信息,你可以做基本的模型式查找找到它。除此之外,Authlogic還有一個插件架構,支持Facebook Connect,這可能會對您有所幫助。
我可以給你CakePHP的方式(最初被設計成像rails一樣)。
所有CakePHP模型擴展相同的父AppModel,並且所有控制器擴展AppController。
我會在代表您的對象的AppModel中創建一個空參數。然後在AppController中,如果對象存在,我會將對象存儲在當前模型的參數中。在CakePHP AppController中有一個名爲beforeFilter()的回調,它在控制器中的任何代碼之前觸發。檢查對象並將其存儲在模型中的理想位置是Rails對此beforeFilter回調的任何等價物。
這是除非所有模型都不使用該對象。如果是這樣,你可以只將參數放在使用它的模型中(而不是父類),然後在AppModel的beforeFilter中,你可以首先檢查模型是否有這個空參數。
我知道這不是紅寶石,但它應該是這樣的:
public function beforeFilter() {
if (isset($this->{$this->modelName}->yourObjectParameter)) {
$this->{$this->modelName}->yourObjectParameter = $this->yourObject;
}
}
$this->modelName
是對應於當前模型的名稱的字符串。 PHP中的約$this->modelName
稱爲複雜語法。它基本上將字符串轉換爲模型對象。不知道如何在Ruby中做同樣的事情。
你可以把你的方法應用控制器,這樣的事情
類ApplicationController中<的ActionController :: Base的
的before_filter:get_facebook_session
高清get_facebook_session
@facebook_session = <your code >
末
末
而且你可以從你的控制器和視圖
歡呼
sameera
這並沒有解決將它傳遞給模型的問題,這是造成代碼異味的原因。 – 2010-08-26 04:20:08
謝謝邁克。我之前使用過Authlogic +插件。我遷移到與Facebook完全綁定的用戶身份,所以Authlogic提供的salting和密碼處理變得無關緊要,我拿走了。我最終只是將一些authlogic的插件功能提取到過濾器方法中。把設計/ authlogic放在其他優勢我可能錯過了嗎? – ambertch 2010-08-26 19:12:03
實際上,我真的很愚蠢 - 我正在通過本次會議b/c我需要我嵌入的OAuth訪問令牌,並非所有用戶都有一個(有些是「假」用戶)。但是,我有一個體繫結構保證,我傳入的任何模型方法都需要會話的訪問令牌,可以訪問具有訪問令牌的用戶。再次感謝邁克,你的迴應幫助我思考問題。 – ambertch 2010-08-26 19:32:01