2012-12-18 40 views
0

我有一個屬於用戶和公司的Log模型。爲了設置這個,我在logs_controller的create動作中使用了這段代碼。在模型導軌中設置嵌套屬性

def create 
    @log = Log.new(params[:log]) 
    @log.user = current_user 
    @log.firm = current_firm 
    @log.save 
    end 

CURRENT_USER和current_firm來自application_helper.rb

輔助方法雖然這個作品它使控制器的脂肪。我怎樣才能把它移到模型上?

+0

我個人並不認爲你是什麼在這裏很胖,可能有很好的理由來完全按照你的要求進行編碼。事實上,您可能需要這樣做,以避免將用戶和公司放入模型的attr_accessible中。 – aceofspades

+0

太多地方就是這樣。最初我對它很好,但現在它很多;) –

+0

我同意'attr_accessible'。我喜歡這個工人類的原因之一是它有助於強制創建模型實例的單一入口點,並強制建立必要的關係(雖然驗證也會對此有所幫助;工作者方法的簽名有助於充當指引)。它還使測試控制器中可用於操縱模型的功能變得簡單。 – deefour

回答

3

我相信這種功能在lib/一個「工人」類屬。我的操作方法可能看上去像

def create 
    @log = LogWorker.create(params[:log], current_user, current_firm) 
end 

然後我不得不像

module LogWorker 
    extend self 

    def create(params, user, firm) 
    log  = Log.new(params) 
    log.user = user 
    log.firm = firm 

    log.save 
    end 
end 

這是一個簡化的例子在lib/log_worker.rb模塊;我通常命名空間的一切,所以我的方法實際上可能是在MyApp::Log::Manager.create(...)

+1

我真的很喜歡這種方法。我覺得在模型和控制器中有點尷尬。謝謝! –

0

沒有區別:您可以重構代碼:

def create 
    @log = Log.new(params[:log].merge(:user => current_user, :firm => current_firm) 
    @log.save 
end 

和你的日誌有:

attr_accessible :user, :firm 
0

不是要短得多,但對於CURRENT_USER的處理的責任落在控制器在MVC

def create 
@log = Log.create(params[:log].merge(
    :user => current_user, 
    :firm => current_firm)) 
end 

編輯

如果你不介意侵犯MVC一點,這是一個辦法:

# application_controller.rb 
before_filter :set_current 
def set_current 
    User.current = current_user 
    Firm.current = current_firm 
end 

# app/models/user.rb 
cattr_accessor :current 

# app/models/firm.rb 
cattr_accessor :current 

# app/models/log.rb 
before_save :set_current 
def set_current 
    self.firm = Firm.current 
    self.user = User.current 
end 

# app/controllers/log_controller.rb 
def create 
    @log = Log.create(params[:log]) 
end 
+0

謝謝你的回答。問題在這個問題上有點簡化。我有更復雜的事情發生。我只是想把它弄出來。 ;) –

+0

@Lyngstad我更新了一個乾淨的,但非MVC的方式來處理這可能是有趣的,如果這種代碼遍佈各地 – Unixmonkey