2011-08-23 52 views

回答

8

您需要在控制器中處理它。首先在模型上執行保存,然後如果成功更新記錄字段。

class MyController < ActionController::Base 
    def index 
    if record.save 
     record.update_attribute :updated_by, current_user.id 
    end 
    end 
end 

另一種替代方法(我喜歡這個)是創建模型中的一個自定義的方法,該方法包的邏輯。例如

class Record < ActiveRecord::Base 
    def save_by(user) 
    self.updated_by = user.id 
    self.save 
    end 
end 

class MyController < ActionController::Base 
    def index 
    ... 
    record.save_by(current_user) 
    end 
end 
+0

+1觸控方法:) – lucapette

+0

之所以把它在模型的是,它是乾的,因爲保存( )可以從應用程序中的許多地方調用,而不僅僅是一個控制器。我寧願只做一次,也不必重複我的自我,並擔心總是記住設置它。 – pixelearth

+0

然後創建一個新方法,如Model.save_from_user(用戶),並在那裏放置邏輯以保存記錄並執行觸摸操作。然後,在你的控制器中簡單地調用該方法傳遞'current_user'作爲參數。 –

1

我已經實現了基於西蒙娜Carletti酒店的建議此猴補丁,據我可以告訴touch只做時間戳,而不是用戶ID。這有什麼不對嗎?這是設計用於設計current_user

class ActiveRecord::Base 
    def save_with_user(user) 
    self.updated_by_user = user unless user.blank? 
    save 
    end 

    def update_attributes_with_user(attributes, user) 
    self.updated_by_user = user unless user.blank? 
    update_attributes(attributes) 
    end 
end 

然後是createupdate方法調用這些像這樣:

@foo.save_with_user(current_user) 
@foo.update_attributes_with_user(params[:foo], current_user)