2011-08-23 8 views

risposta

8

È necessario gestirlo nel controller. Esegui prima il salvataggio sul modello, poi se ha successo aggiorna il campo del record.

Esempio

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

Un'altra alternativa (preferisco questo) è quello di creare un metodo personalizzato nel modello che avvolge la logica. Per esempio

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 per il metodo di tocco :) – lucapette

+0

La ragione di metterlo nel modello è che è asciutto, dal momento che Save () può essere chiamato da molti posti nell'app, non solo da un controller. Preferirei farlo solo una volta, senza dover ripetere me stesso, e preoccuparmi di ricordare sempre di impostare questo. – pixelearth

+0

Quindi creare un nuovo metodo, come Model.save_from_user (utente) e posizionare la logica per salvare il record ed eseguire il tocco. Quindi, nel controller semplicemente chiama quel metodo passando l'utente corrente come argomento. –

1

ho implementato questo monkeypatch sulla base del parere di Simone Carletti, per quanto ho potuto dire touch fa solo timestamp, non l'utenti id. c'è qualcosa di sbagliato con questo? Questo è progettato per funzionare con un dispositivo 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 

E poi i metodi create e update chiamare queste in questo modo:

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