2011-08-23 49 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)