2012-08-02 61 views
0

林與一箇中等大小的Rails應用程序工作,我在每個控制器做到這一點:重構編輯用戶的Rails

def create 
    @object = Model.new(params[:model].merge(editing_user: current_user)) 
    ... 
end 

def update 
    @object = Model.find(params[:id]) 
    @object.editing_user = current_user 
    ... 
end 

在設置編輯用戶一遍又一遍不幹燥。我想到了一個觀察者清理它,但它需要訪問當前用戶。觀察員不能訪問當前用戶,他們也不應該(Demeter法)。

任何建議如何幹這控制器之間?

回答

1
class ApplicationController < ActionController::Base 
    before_filter :init_request 

    def init_request 
    params[:editing_user] = current_user 
    end 
end 
+0

我會用這個解決方案,謝謝! :) – Sven 2012-08-02 17:55:44

1

我喜歡用decent_exposure乾涸我的控制器。它會根據是否將id傳遞爲param來自動查找或初始化模型實例,並從params[:model]分配屬性。

要完成代碼幹化,您可以使用新的策略支持(請參見自述文件的末尾),以自動設置模型上的editing_user屬性。

+0

decent_exposure看起來不錯!我肯定會研究這一點,謝謝你的提示。對於這個項目,我不想要任何額外的依賴關係。 – Sven 2012-08-02 17:34:13

1

你可以試試after_filter。也許是這樣的:

class ApplicationController < ActionController::Base 
    after_filter :set_editing_user 

def set_editing_user 
    @object.update_attribute(:editing_user, current_user) if @object && current_user 
end 

困難,當然,是你會保存對象每次調用兩次。雖然創作和更新不會頻繁發生,以至於兩個數據庫提交是一個嚴重的問題,但是如果您希望成爲下一個推特(具有大量數據庫插入負載),這可能是一個問題。

您也可以將其設置爲before_filter,但您必須在之前的before_filter中找到或設置對象。否則@object將始終爲零,並且before_filter將永遠不會觸發。您可以使用過濾器排序方法prepend_before_filterappend_before_filter來確保這些過濾器的正確排序。