1

J'utilise hair_trigger gem et dans mon modèle, je veux conserver les modifications apportées à certaines colonnes.Ajouter un ID utilisateur en cours pour déclencher la requête sql hair_trigger gem rails

trigger.after(:insert).declare("#{current_user.id} as current_user_id") do 
    "insert into histories (item_type, item_id, field, old_value, new_value, changed_by, created_at, updated_at) values ('CaseStatus', NEW.id, 'loan_case_id', '', NEW.loan_case_id, current_user_id, current_timestamp, current_timestamp);" 
    end 

Je pensais que je pourrais être en mesure de déclarer et de transmettre l'ID current_user dans ma requête afin que je puisse enregistrer l'utilisateur qui a effectué les changements, mais je reçois une erreur au sujet 'undefined variable current_user'

Est-ce que quelqu'un sait comment je peut être en mesure de sauver l'utilisateur qui a déclenché les changements en utilisant hair_trigger gem dans un modèle Rails.

beaucoup apprécié

+0

Mais avez-vous jeté un coup d'oeil à la gemme 'papertrail', elle fait exactement ce que vous cherchez, suit les modifications apportées aux modèles. – Iceman

+1

Je sais que ce n'est pas une réponse directe à votre question, mais avez-vous envisagé d'utiliser une gemme d'audit? Jetez un oeil à https://github.com/collectiveidea/audited ou https://github.com/airblade/paper_trail –

+0

Je n'ai jamais utilisé cette gemme, est-il même possible d'envoyer des paramètres à la fonction de déclenchement comme ça? – Iceman

Répondre

0

Comme indiqué précédemment dans les commentaires que vous ne pourrez pas accéder à current_user dans vos modèles par la conception. Une façon de contourner cela est d'utiliser le thread actuel. Les gens essaient souvent de rester loin de cela parce que ce n'est pas convivial lors de l'utilisation de serveurs Web comme Puma. Je recommande fortement d'utiliser une gemme d'audit comme Audited ou PaperTrail, mais si vous voulez garder votre approche, vous pouvez faire quelque chose comme ça.

# User.rb 
def self.current_user 
    Thread.current[:current_user] ||= nil 
end 

def self.current_user=(user) 
    Thread.current[:current_user] = user 
end 

Vous pouvez définir cette variable dans chaque demande, vous avez un current_user, comme dans le ApplicationController en utilisant un filtre avant ou même un filtre autour de le nettoyer par la suite.

# ApplicationController.rb 
before_action :share_current_user 

def share_current_user 
    User.current_user = current_user 
end 

En outre, jetez un oeil à RequestStore. Cela devrait rendre votre vie plus facile pour accomplir ceci.