Me gustaría utilizar una devolución de llamada after_save para establecer la columna updated_by al current_user. Pero el usuario_actual no está disponible en el modelo. ¿Cómo debería hacer esto?after_save devolución de llamada para establecer la columna updated_by al usuario_actual
6
A
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
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 create
update
llaman éstos, así:
@foo.save_with_user(current_user)
@foo.update_attributes_with_user(params[:foo], current_user)
Cuestiones relacionadas
- 1. Devolución de llamada - after_save pero NO crear
- 2. Uso de la devolución de llamada after_save para modificar el mismo objeto sin activar la devolución de llamada nuevamente (recursión)
- 3. ¿Cómo after_save trabajo al guardar un objeto
- 4. Devolución de llamada al método en el modelo diferente
- 5. devolución de llamada para manejar la finalización de la tubería
- 6. ¿Cómo detectar si se ha cambiado un archivo adjunto de clip en la devolución de llamada after_save?
- 7. ¿Hay una devolución de llamada para History.pushstate?
- 8. devolución de llamada en C#, orden de llamada y devolución
- 9. Rails after_save callback se llama varias veces
- 10. Devolución de llamada asincrónica
- 11. iCloud: Devolución de llamada para NSFileManager's startDownloadingUbiquitousItemAtURL?
- 12. Devolución de llamada para apio apply_async
- 13. ¿cómo puedo activar la devolución de llamada de error ajax en la devolución de llamada exitosa?
- 14. parámetro Pass para devolución de llamada función
- 15. ¿Tiene el dispositivo 'devolución de llamada'?
- 16. Cómo establecer una devolución de llamada cuando WebView ha procesado datos (está listo para mostrarse)
- 17. se el método ClientScriptManager.RegisterForEventValidation para registrar la devolución de datos o los datos de devolución de llamada para la validación
- 18. Javascript para la devolución de llamada de bucle?
- 19. Devolución de llamada asíncrona concurrente
- 20. cómo inicializar su aplicación dentro de la columna vertebral require.js después de devolución de llamada externa
- 21. Desplazamiento infinito y la devolución de llamada
- 22. función de devolución de llamada animada (completa) ejecutada al inicio?
- 23. estableciendo una función de devolución de llamada para objetos observables
- 24. ¿Cómo puedo agregar una devolución de llamada al método .apply()?
- 25. devolución de llamada de animación jquery - cómo pasar parámetros a la devolución de llamada
- 26. Knockout.js ViewModel cambiar la devolución de llamada?
- 27. devolución de llamada en android?
- 28. Devolución de llamada en C#
- 29. Diseñar usuario_actual en routes.rb
- 30. Devolución de llamada en C#
+1 para el método de contacto :) – lucapette
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
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. –