Vorrei utilizzare un callback after_save per impostare la colonna updated_by su current_user. Ma l'utente corrente non è disponibile nel modello. Come dovrei farlo?call_save callback per impostare la colonna updated_by sull'utente corrente
6
A
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
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
- 1. Come rilevare se un allegato di graffetta è stato modificato in call_save callback?
- 2. Ottenere la colonna ordinata corrente in DataTable
- 3. Rails impostare la data corrente come valore di default
- 4. Popup magnifico: richiama l'elemento corrente nel callback
- 5. Come impostare l'host corrente per Passport strategy callbackURL?
- 6. Impostare valore iniziale per la colonna con autoincrement
- 7. Come impostare la directory corrente di SBCL usando la melma?
- 8. Come inserire la data corrente nella colonna della riga
- 9. fmt Assegnazione: uscita FormatoData a corrente alternata: impostare la variabile
- 10. Come impostare la scheda corrente in viewpager con tablayout
- 11. MySQL impostare la data corrente in un campo DATETIME sull'inserto
- 12. Come impostare la pagina corrente "attiva" in php
- 13. Come impostare la directory di lavoro/corrente in Vim?
- 14. imposta JFileChooser per aprire la directory corrente
- 15. Come impostare l'ora a mezzanotte per il giorno corrente?
- 16. Yii2 GridView non può impostare la larghezza della colonna
- 17. Come impostare la colonna della tabella in Android
- 18. GridBagLayout: come impostare la larghezza della colonna fissa?
- 19. Come impostare VS-Code per aprire nuovi file nell'istanza corrente?
- 20. Come impostare la dimensione della colonna del file csv?
- 21. come impostare il valore predefinito per la colonna nei binari durante la creazione della migrazione
- 22. Come impostare la lunghezza massima della colonna del datagridview
- 23. Rails 3- Active Admin (Formtastic), impostare la colonna Width
- 24. ThreeJS - come impostare l'ora corrente in Animazione
- 25. Come impostare l'attività successiva dall'attività automatica corrente?
- 26. Impostare la directory di lavoro corrente vim sulla root di progetto corrente o sulla directory del file corrente
- 27. Laravel 5.1 specificando la pagina corrente per l'impaginazione
- 28. FBSDKShareDialog callback per iOS
- 29. Visualizza la riga corrente e il numero di colonna per un'area testo
- 30. change_column_null per la colonna esistente
+1 per il metodo di tocco :) – lucapette
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
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. –