web-dev-qa-db-fra.com

Accès Ruby variables de hachage

Je suis assez nouveau pour Ruby et sinatra mais en gros j'ai cette route:

put '/user_list/:user_id' do
    puts request.params["model"]
end

et il renvoie ce qui suit

{"password":"36494092d7d5682666ac04f62d624141","username":"nicholas","user_id":106,"firstname":"Nicholas","email":"[email protected]","is_admin":0,"lastname":"Rose","privileges":""}

J'ai maintenant du mal à accéder aux valeurs de chacun d'eux. Il ne semble pas vraiment être au format de hachage, donc je ne peux pas vraiment le faire

request.params["model"][:password]

Il ne renvoie que zéro ..

J'ai juste besoin de savoir ce que je peux faire pour accéder à ces variables, ou comment configurer mes paramètres de demande pour être dans un bon format pour accéder aux variables.

16
Blaine Kasten

Essayez request.params["model"]["password"]

Les clés d'un Hash peuvent être composées à la fois de symboles et de chaînes. Cependant, une clé de chaîne est différente d'une clé de symbole.

Notez les points suivants:

h = {:name => 'Charles', "name" => 'Something else'}
h[:name] #=> 'Charles'
h["name"] #=> 'Something else'

MODIFIER:

Dans votre situation particulière, il apparaît request.params["model"] renvoie une chaîne au lieu d'un hachage. Il existe une méthode String#[] qui est un moyen d'obtenir une sous-chaîne.

s = "Winter is coming"
s["Winter"] #=> "Winter"
s["Summer"] #=> nil

Cela expliquerait vos commentaires.

Vous pouvez prendre quelques mesures pour remédier à votre situation spécifique. J'ai trouvé le moyen le plus simple d'utiliser JSON. (Je suis sûr qu'il y en a d'autres et peut-être que ceux-ci apparaîtront dans d'autres réponses ou dans des commentaires.)

require 'json'
hash_of_params = JSON.load(request.params["model"]).to_hash
hash_of_params["password"] #=> "36494092d7d5682666ac04f62d624141"
44
Charles Caldwell

Le hachage standard traite les chaînes et les symboles différemment, et je serais prêt à parier que c'est ce qui se passe dans ce cas.

Utilisation request.params["model"]["password"] pour obtenir le mot de passe.

L'exception à cela est lorsque vous travaillez avec un HashWithIndifferentAccess qui fait partie d'ActiveSupport. Pour les hachages de ce type, des chaînes ou des symboles peuvent être utilisés pour accéder aux mêmes éléments.

5
user1454117

Essayez ce qui suit, cela fonctionnera aussi:

request.params["model"][:password.to_s]
0
Arup Rakshit