访问Ruby哈希变量

时间:2013-04-24 14:09:53

标签: ruby hash sinatra

我对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 个答案:

答案 0 :(得分:32)

尝试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"

答案 1 :(得分:3)

标准Hash以不同方式处理字符串和符号,我愿意打赌这就是在这种情况下发生的事情。

使用request.params["model"]["password"]获取密码。

例外情况是使用属于ActiveSupport的HashWithIndifferentAccess时。对于该类型的哈希,可以使用字符串或符号来访问相同的元素。

答案 2 :(得分:0)

尝试下面的内容,它也会起作用:

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