2010-08-25 65 views
0

在我的Rails應用程序中,我試圖讓控制器變得更瘦,並且遇到了一個對象的困難,我不得不繞過它。需要幫助的代碼氣味

該對象表示用戶的Facebook會話,並且在會話之外被實例化,因此它存在於事物的控制器端。許多模型方法使用它,所以它在整個地方反覆傳入。

這聽起來像什麼東西,如何幹起來Rails的方式?謝謝!

回答

1

首先訪問@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,這可能會對您有所幫助。

+0

謝謝邁克。我之前使用過Authlogic +插件。我遷移到與Facebook完全綁定的用戶身份,所以Authlogic提供的salting和密碼處理變得無關緊要,我拿走了。我最終只是將一些authlogic的插件功能提取到過濾器方法中。把設計/ authlogic放在其他優勢我可能錯過了嗎? – ambertch 2010-08-26 19:12:03

+0

實際上,我真的很愚蠢 - 我正在通過本次會議b/c我需要我嵌入的OAuth訪問令牌,並非所有用戶都有一個(有些是「假」用戶)。但是,我有一個體繫結構保證,我傳入的任何模型方法都需要會話的訪問令牌,可以訪問具有訪問令牌的用戶。再次感謝邁克,你的迴應幫助我思考問題。 – ambertch 2010-08-26 19:32:01

1

我可以給你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中做同樣的事情。

+0

很酷謝謝。是的,我正在考慮一個before_filter做一個「如果Model.object不存在,將其設置爲使用」。我想人們可以通過擴展模型的超類與對象來進一步實現它。我真的不知道Rails是否已經隱晦了「railsy-way」,因爲我經常發現這種情況:) – ambertch 2010-08-25 23:49:21

+0

是的,這一直髮生在我身上。我自己制定一個DRY解決方案,然後Bam!已經有一個CakePHP方法。 ;) – Stephen 2010-08-25 23:56:37

0

你可以把你的方法應用控制器,這樣的事情

類ApplicationController中<的ActionController :: Base的

的before_filter:get_facebook_session

高清get_facebook_session

@facebook_session = <your code > 

而且你可以從你的控制器和視圖

歡呼

sameera

+0

這並沒有解決將它傳遞給模型的問題,這是造成代碼異味的原因。 – 2010-08-26 04:20:08