2013-04-24 74 views
3

我非常新的Ruby和西纳特拉但基本上我有这样的路线:访问Ruby的哈希变量

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

,并返回以下

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

我现在有一个很难访问值的每一个。它并没有真正似乎是哈希格式,所以我真的不能做

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

它只是返回零..

我只需要知道我能做些什么来访问这些变量,或如何将我的请求参数配置为访问变量的良好格式。

回答

20

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

这只是返回“密码”和密码不是值。 – 2013-04-24 14:13:39

+0

+1比我快。 – 2013-04-24 14:16:43

+0

@BlaineKasten可能是因为你在你的视图中发送了'password =“password”'。 – alf 2013-04-24 14:18:32

2

标准的哈希对待字符串和符号不同,而且我愿意打赌这是发生了什么事在这案件。

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

与ActiveSupport的一部分HashWithIndifferentAccess一起使用时的例外情况。对于该类型的散列,可以使用字符串或符号来访问相同的元素。

+0

+1提及'HashWithIndifferentAccess' – 2013-04-24 14:17:46

+0

我不知道HashWithIndeferentAccess。非常好。不过,我认为我的回归是一个字符串。所以这些选项不适合它。知道如何处理它知道它是一个字符串对象? – 2013-04-24 14:45:20

+0

哦,所以你的意思是'puts request.params [“model”]。class#=> String'? – 2013-04-24 14:52:26

0

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

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

这只是再次返回“密码”。我认为可能是我的值从request.params [“model”]返回的值是字符串类型.. – 2013-04-24 14:31:53

+0

@BlaineKasten所以你提到了'nil',这很明显,因为你的哈希键是String对象。因此像':password'这样的'Symbol'对象返回'nil'。为了使它工作,我说在符号上使用'to_s'或者直接使用''password“'。 – 2013-04-24 14:36:11

+0

我只是试了一遍,所有它返回的是'密码'感谢您的帮助。 – 2013-04-24 14:44:24