访问Ruby哈希变量

23

我对Ruby和Sinatra都比较新,但基本上我有这个路由:

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

并且它返回以下内容

{"password":"36494092d7d5682666ac04f62d624141","username":"nicholas","user_id":106,"firstname":"Nicholas","email":"nicholas@macpractice.com","is_admin":0,"lastname":"Rose","privileges":""}

我现在很难访问每个值。它似乎并不是哈希格式,所以我无法这样做。

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

它只返回nil。

我只需要知道如何访问这些变量,或者如何配置我的请求参数才能以良好的格式访问变量。

3个回答

56

尝试 request.params["model"]["password"]

Hash(哈希表)的键可以由符号和字符串组成。但是,字符串键与符号键是不同的。

请注意以下内容:

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

编辑:

在你的特定情况下,看起来request.params ["model"]返回的是一个字符串而不是一个哈希。有一个方法String#[]可以用来获取子字符串。

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

这可以解释你的评论。

有几件事情可以解决你的具体情况。我发现最简单的方法是使用 JSON。(我相信还有其他方法,也许会在其他答案或评论中出现。)

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

2
这只返回“password”,而不是密码的值。 - Blaine Kasten
@BlaineKasten 可能是因为你在视图中发送了 password="password" - alf
@BlaineKasten {"foo": "bar"}{"foo" => "bar"} 只是表示 Hash 的两种不同方式。 - Charles Caldwell
还要注意 {"foo" : "bar"} 是有效的 JSON。但是,即使您的参数不是哈希(如 JSON),它仍会像哈希一样响应 {"foo" => "bar"}.to_json["foo"] #=> "bar" - Charles Caldwell
@BlaineKasten 看起来你的 request.params["model"] 可能会返回一个字符串而不是哈希。如果是这种情况,我已经编辑了我的答案并提供了可能的解决方案。 - Charles Caldwell
显示剩余2条评论

5
标准哈希表将字符串和符号视为不同类型,在这种情况下,我敢打赌这就是问题所在。
使用request.params["model"]["password"]来获取密码。
特例是在使用HashWithIndifferentAccess时,它是ActiveSupport的一部分。对于这种类型的哈希表,可以使用字符串或符号访问相同的元素。

我之前不知道有HashWithIndeferentAccess这个东西,非常好。但是,我认为我的返回值是一个字符串。所以这些选项对它不起作用。你有什么想法如何处理它,知道它是一个字符串对象吗? - Blaine Kasten
哦,你的意思是 puts request.params["model"].class #=> String - user1454117
@BlaineKasten 鸭子类型 对于这个很好,例如 request.params["model"].respond_to? :method_you_want_to_use_next 例如 if request.params["model"].respond_to? :fetch 那么它就是一个哈希。查看String,然后挑选出一些使其成为字符串的内容,或者更好的是,你想在该字符串上调用的内容。 - ian

0

尝试下面的代码,它也可以工作:

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

这只是再次返回“password”。我认为问题可能在于我的request.params [“model”]返回的值是字符串类型。 - Blaine Kasten
@BlaineKasten,你提到了 nil,这很明显是因为你的哈希表的键是字符串对象。因此像 :password 这样的符号对象返回了 nil。为了使它起作用,我建议你在符号上使用 to_s 或直接使用 "password" - Arup Rakshit
我刚刚再次尝试了一下,它只返回了“密码”。不过还是感谢您的帮助。 - Blaine Kasten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接