2011-08-23 10 views

Respuesta

8

Debe manejarlo en el controlador. Primero ejecute el guardado en el modelo, luego, si tiene éxito, actualice el campo de registro.

Ejemplo

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

Otra alternativa (prefiero éste) es crear un método personalizado en su modelo que envuelve la lógica. Por ejemplo

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 para el método de contacto :) – lucapette

+0

La razón para ponerlo en el modelo es que está seco, ya que guardar () se puede llamar desde muchos lugares en la aplicación, no solo con un controlador. Prefiero simplemente hacerlo una vez, y no tener que repetirme, y preocuparme por recordar siempre establecer esto. – pixelearth

+0

A continuación, cree un nuevo método, como Model.save_from_user (user) y coloque allí la lógica para guardar el registro y realizar el toque. Luego, en su controlador simplemente llame a ese método pasando el 'current_user' como argumento. –

1

he implementado este monkeypatch basándose en el asesoramiento de Simone Carletti, por lo que yo podría decir touch marcas de tiempo sólo, no el ID de usuarios. ¿Hay algo malo con esto? Esto está diseñado para trabajar 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 

Y a continuación, los métodos y createupdate llaman éstos, así:

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