字符串vs符号rails

时间:2017-08-30 14:22:06

标签: ruby-on-rails ruby rspec

在我的rspec测试中,我被困了几天。然后我发现问题是使用符号而不是字符串

user_response = JSON.parse(response.body, symbilize_names: true)
expect(user_response[:email]).to eql(@user.email)

上述代码始终失败,因为user_response[:email]由于某些原因返回nil

但当我将其更改为user_responce['email']时,测试通过了

使用byebug进行调试以检查user_response的值

(byebyg) user_response
{"id"=>1, "email"=>"enola@bauch.ca", "created_at"=>"2017-08-30T14:22:43.597Z", "updated_at"=>"2017-08-30T14:22:43.597Z"}

在上面的案例中使用符号和字符串有什么区别?

3 个答案:

答案 0 :(得分:5)

在Ruby中使用Hash时,任何对象(如字符串或符号)都可以用作键。但是,:email"email"是不同的对象,因此要查找对象,必须使用与存储值相同的对象。

你可能会感到困惑的是,Rails在某些地方使用了HashWithIndifferentAccess。这是一个自定义哈希,其中密钥:foo"foo"被认为是相同的。这允许您使用例如params[:user]params["user"]可以互换,但这不是一般情况。

Stefan发现时,字符串被用于解析的JSON对象中的键的原因只是选项中的一个小错误:symbilize_names它应该是symbolize_names }。

答案 1 :(得分:4)

这实际上与符号或字符串本身无关。你有一个哈希。该哈希包含密钥'email'的值。它不包含密钥'foobar'42:hello[1, 2, 3]:email的值。例如,如果您询问其中一个的值,则会得到默认值,默认为nil

这与符号或字符串无关。您只是询问哈希值是否存在不存在的键。哈希中没有键:email,因此你得到默认值。

答案 2 :(得分:2)

符号和字符串只是不同类型的对象。与'5'5相同。他们表面上看起来相似,但实际上它们并不相关。

  

在上面的案例中使用符号和字符串有什么区别?

在您的情况下,您的数据结构包含字符串键,并且不包含符号键。就这么简单。