[RAILS] Remarques sur le fil de discussion Ruby # [] = méthode

À propos de Ruby's Thread # [] = méthode

La méthode Ruby Thread # [] = vous permet de conserver une valeur unique pour chaque thread. (C'est comme ThreadLocal en Java) Si vous l'utilisez, le serveur d'application (presque tous les serveurs AP tels que Passenger) associé à 1 thread et 1 requête Il peut être utilisé comme une variable locale de thread qui ne peut être fermée et utilisée que lors d'une seule requête.

Exemple d'utilisation de la méthode Ruby's Thread.current []

Vous pouvez définir la variable locale du thread foo en affectant Thread.current [: foo] au thread actuel comme suit:

def self.foo
  Thread.current[:foo] ||= 0
end

Il existe également un joyau appelé RecordWithOperator qui fournit au framework Ruby on Rails la possibilité d'enregistrer des opérateurs d'enregistrement (créateurs, mises à jour, suppresseurs). Il est implémenté en utilisant ce Thread # [] =. https://github.com/nay/record_with_operator/blob/4389d077b0303b956cc211ef439a46a216ae2cc0/lib/record_with_operator/operator.rb#L4

Thread # [] = Remarques sur la méthode

Si vous utilisez un serveur d'applications tel que Passenger ou Puma qui réutilise les threads une fois créés Puisque la variable locale de thread est associée au thread qui est censé être réutilisé, elle doit être explicitement détruite côté application. Veuillez noter que les variables définies dans la requête précédente (thread) peuvent être référencées dans une autre requête.

Redmine avait également auparavant du code pour gérer l'utilisateur actuel en utilisant Thread # [] = Il y a eu un cas de bogue de sécurité dans lequel le nom d'un autre utilisateur était affiché dans le message d'erreur. http://www.redmine.org/issues/16685

Solution

Cela peut être évité en supprimant explicitement la valeur Thread.current du côté de l'application. Si vous utilisez un gem appelé RequestStore, vous pouvez utiliser la couche Rack :: Middleware pour chaque requête. Il va maintenant effacer la valeur de Thread.current.

Un exemple d'utilisation est le suivant:

def self.foo
  RequestStore.store[:foo] ||= 0
end

Recommended Posts

Remarques sur le fil de discussion Ruby # [] = méthode
[Ruby] Notes sur la méthode gets
Méthode Ruby to_s
Notes de Ruby Hash
[Ruby] méthode d'initialisation
Méthode de construction Ruby
Méthode d'accesseur Ruby
méthode de la carte rubis
abréviation de la méthode ruby
définition de la méthode ruby
[Ruby] Résumé des définitions de méthode
[Java] Notes de méthode de base
Comment vérifier les nombres entiers avec ruby
Algorithme Ruby (injection, définition de méthode)
[Ruby] Méthode qui renvoie la vérité
[ruby] Appel d'une méthode avec un argument
[Java] Nouvelle méthode de génération de threads (1)
Modèle de conception par la méthode Ruby Template Mémo de modèle
[Ruby] Méthode pour compter des caractères spécifiques
[Bases de Ruby] méthode split et méthode to_s
Remarques sur le traitement des threads Android (java)
[Ruby on Rails] Méthode d'aide pratique
Comment utiliser la méthode Ruby inject
Méthode d'installation de Ruby on Rails [édition Mac]
Implémentation de la "méthode de détection de circulation Floyd" dans Ruby
Ruby print met la méthode de sortie p printf
Remarques sur l'utilisation de FCM avec Ruby on Rails
[Ruby / Rails] Mécanisme de nouvelle tentative d'erreur de thread
Extraire des caractères de la méthode de tranche de chaîne Ruby