2011-08-23 22 views

Trả lời

8

Bạn cần xử lý trong bộ điều khiển. Trước tiên, hãy thực hiện lưu trên mô hình, sau đó nếu cập nhật thành công trường bản ghi.

Ví dụ

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

Một thay thế (tôi thích cái này) là để tạo ra một phương pháp tùy chỉnh trong mô hình của bạn mà kết thúc tốt đẹp logic. Ví dụ

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 cho phương pháp liên lạc :) – lucapette

+0

Lý do cho đặt nó trong mô hình là nó là khô, vì tiết kiệm () có thể được gọi từ nhiều nơi trong ứng dụng, không chỉ một bộ điều khiển. Tôi chỉ muốn làm điều đó một lần, và không phải lặp lại bản thân của tôi, và lo lắng về việc luôn luôn nhớ để thiết lập này. – pixelearth

+0

Sau đó, tạo một phương thức mới, như Model.save_from_user (người dùng) và đặt ở đó logic để lưu bản ghi và thực hiện thao tác chạm. Sau đó, trong bộ điều khiển của bạn chỉ cần gọi phương thức đó truyền tham số 'current_user' làm đối số. –

1

tôi đã thực hiện monkeypatch này dựa trên lời khuyên Simone Carletti, như xa như tôi có thể nói touch timestamps chỉ thực hiện, không phải là người sử dụng id. Có gì không ổn với điều này? Điều này được thiết kế để làm việc với một thiết lập 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 

Và sau đó createupdate phương pháp gọi những như vậy:

@foo.save_with_user(current_user) 
@foo.update_attributes_with_user(params[:foo], current_user) 
Các vấn đề liên quan